11

我有一个运行并侦听麦克风输入的Android服务。我希望它在满足特定条件时启动一项活动。为了创建一个Intent,我需要应用程序上下文。我怎么才能得到它?如何从Android服务获取应用程序上下文?

Intent i = new Intent(ctx, SONR.class); 
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
ctx.startActivity(i); 

上述行不启动我的活动。

这里是我的构造

public SONRClient(Context c, AudioRecord ar, int buffsize, final AudioManager am) { 
    theAudioManager = am; 
    theaudiorecord = ar; 
    bufferSize = buffsize; 
    ctx = c; 
    CLIENT_ON = true; 
} 

这里是我的onCreate

@Override 
public void onCreate() { 
    try { 
     // LogFile.MakeLog("\n\nSONRClient CREATED"); 
     clientStopReceiver = new StopReceiver(); 
     ctx.registerReceiver(clientStopReceiver, 
      new IntentFilter(SONR.DISCONNECT_ACTION)); 
     myByteReceiver = new SONRByteReceiver(); 
     theListener = new MicSerialListener(
      theaudiorecord, bufferSize, myByteReceiver); 
     theApplication = getApplication(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     ErrorReporter.getInstance().handleException(e); 
    } 
} 

有myByteReceiver被监听通过音频输入信号。当它找到匹配的信号时,我希望它发起一个活动。

private class SONRByteReceiver implements ByteReceiver { 
    private long lastplaytime = 0; 
    private long lastmutetime = 0; 
    private long lastskiptime = 0; 
    private long lastvolutime = 0; 
    private long lastbacktime = 0; 

    public void receiveByte(int receivedByte) { 
     try { 
      theKeyEvent = -1; 

      if (ismuted) { 
       if (receivedByte != MUTE) { 
        volume = 0; 
        ismuted = false; 
       } 
      } 

      switch (receivedByte) { 

      case SONR_HOME: 
       Log.d(TAG, "HOME"); 

       Intent i = new Intent(ctx, SONR.class); 
       i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       theApplication.startActivity(i); 

       break; 
      default: 
       Log.d(TAG, "default"); 
       Log.d(TAG,"RECEIVED " + receivedByte); 
       // LogFile.MakeLog("RECEIVED " + receivedByte); 
       break; 
      } 

      if (theKeyEvent >= 0) { 
       sendbroadcast(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      ErrorReporter.getInstance().handleException(e); 
     } 
    } 
} 

这里是堆栈跟踪

java.lang.NullPointerException 
    at com.sonrlabs.test.sonr.SONRClient$SONRByteReceiver.receiveByte(SONRClient.java:320) 
    at com.sonrlabs.test.sonr.AudioProcessor.processSample(AudioProcessor.java:145) 
    at com.sonrlabs.test.sonr.AudioProcessor.run(AudioProcessor.java:58) 

320线是theApplication.startActivity(i);

+1

你可以发布你叫'getApplicationContext'的方法是什么? – Craigy

+0

我发布了它 –

+0

如果您发布了NullPointerException的日志,那将会更有帮助。 – keno

回答

0
ctx.getApplicationContext().startActivity(i) 

热潮。

+0

什么是ctx?你是否从服务启动上述指令? – Lisitso

+0

@Lisitso'ctx'是一个'Context'变量 – Houssni

+1

如果你已经有ctx作为上下文,为什么要获得应用程序上下文然后startActivity?为什么不简单ctx.startActivity()? – Ishaan

4

您可以使用getApplicationContext()您的服务中获得应用程序上下文。

尝试使用

getApplication().startActivity(i); 

android start activity from service

+1

我尝试getApplicationContext()时得到一个空指针异常() –

+0

我更新了我的代码。我参考了上下文,但我的活动没有显示出来。难道我做错了什么? –

+0

getApplication()我得到一个nullpointerexception –

1

你,你需要的应用程序上下文开始的活动是不准确的说法。你可以start an activity from any context,包括服务,这是一个上下文。

+0

我试着用startActivity ),我仍然得到一个nullpointerexception。用更多代码更新问题 –

+0

显示空指针的堆栈轨迹。如果你在该类中使用它,那不是因为空服务。 – dhaag23

+0

问题中的堆栈跟踪是我在调试时打印的所有内容。有关如何进一步调试的任何想法? –

2

更改此:

Intent i = new Intent(ctx, SONR.class); 

到:

Intent i = new Intent(getApplicationContext(),SONR.class); 
+0

,导致nullpointerexception –

+0

不可能,你在其他地方得到空指针异常。如果你的服务正在运行,那么context不能为空。 – Rohit

+0

Stacktrace不会这么说。 –

1

getBaseContext()返回背景下,因为每一个活动来延长Context类

3

每个服务都有自己的内容,只需使用这一点。您不需要传递服务和活动的上下文。

服务中不需要活动上下文。

Intent i = new Intent(ctx, SONR.class); 
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(i); 

只需做你在做活动

服务和活动都是语境的子类。

1

您不能在其公共空构造函数内调用getApplicationContext(),否则它会给你一个NullPointerException

+0

“Service”类中的哪个地方是调用'getApplicationContext()'的安全地方? – JJD

+0

@JJD不要调用getApplicationContext(),因为Android Developer编写的Vishal调用getBaseContext()。 – russellhoff

+0

问题依然存在,在哪种方法中被调用是安全的。 – JJD

0

只是这样做访问服务上下文

Intent i = new Intent(Service.this, SONR.class); 
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(i); 
相关问题