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);
です
ctx.getApplicationContext().startActivity(i)
ブーム。
サービス内でgetApplicationContext()
を使用して、アプリケーションコンテキストを取得できます。
使ってみてください
getApplication().startActivity(i);
すべてのサービスには独自のコンテキストがあります。それを使用してください。サービスにアクティビティのコンテキストを渡す必要はありません。
サービスにアクティビティコンテキストは必要ありません。
Intent i = new Intent(ctx, SONR.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
アクティビティで行うように単純に行う
サービスとアクティビティはどちらもコンテキストのサブクラスです。
これを変える:
Intent i = new Intent(ctx, SONR.class);
に:
Intent i = new Intent(getApplicationContext(),SONR.class);
アクティビティを開始するにはアプリケーションコンテキストが不正確である必要があると主張しています。 任意のコンテキストからアクティビティを開始 (コンテキストであるサービスを含む)できます。
getBaseContext()すべてのアクティビティがContextクラスを拡張するため、コンテキストを返します
これを実行して、サービスコンテキストにアクセスします
Intent i = new Intent(Service.this, SONR.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);