Ответ 1
ctx.getApplicationContext().startActivity(i)
бум.
У меня есть служба 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);
}
}
}
Вот stacktrace
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);
Просто сделайте так, как вы делаете в Activity
Служба и активность - это подклассы контекста.
Измените это:
Intent i = new Intent(ctx, SONR.class);
в
Intent i = new Intent(getApplicationContext(),SONR.class);
Вы утверждаете, что вам нужен контекст приложения для запуска активности, является неточным. Вы можете запустить действие из любого контекста, включая службу, которая является контекстом.
getBaseContext(), который возвращает контекст, поскольку каждое действие расширяет класс контекста
Вы не должны вызывать getApplicationContext()
внутри своего публичного пустого конструктора, или он даст вам NullPointerException
.
Просто сделайте это для доступа к контексту службы
Intent i = new Intent(Service.this, SONR.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);