如何从Android服务获取应用程序上下文?

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

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通过音频输入监听信号。 当它find匹配的信号时,我希望它启动一个活动。

 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);

您可以在服务中使用getApplicationContext()来获取应用程序上下文。

尝试使用

 getApplication().startActivity(i); 

android从服务启动活动

每个服务都有自己的Context,只需使用它。 您不需要传递服务和活动的上下文。

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

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

只需像活动那样做

Service和Activity都是Context的子类。

改变这个:

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

至:

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

您断言需要应用程序上下文来启动活动是不准确的。 您可以从任何上下文启动活动 ,包括作为上下文的服务。

getBaseContext()返回上下文,因为每个活动都扩展了Context类

您不能在其公共空构造函数中调用getApplicationContext() ,否则它将为您提供NullPointerException

 ctx.getApplicationContext().startActivity(i) 

繁荣。

只需执行此操作即可访问服务上下文

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