Как получить контекст приложения из службы Android? - PullRequest
13 голосов
/ 29 ноября 2011

У меня есть служба 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 , который прослушивает сигналы через аудиовход.Когда он находит соответствующий сигнал, я хочу, чтобы он запустил действие.

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

Ответы [ 8 ]

4 голосов
/ 09 июля 2015

Каждый сервис имеет свой собственный контекст, просто используйте его.Вам не нужно передавать Сервису Контекст Активности.

Нет необходимости в контексте Активности в Сервисе.

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

Просто делайте, как вы делаете в Деятельности

Служба и активность являются подклассами контекста.

4 голосов
/ 29 ноября 2011

Вы можете использовать getApplicationContext() внутри своего сервиса, чтобы получить контекст приложения.

Попробуйте использовать

getApplication().startActivity(i);

андроид запускает активность из сервиса

2 голосов
/ 29 ноября 2011

Измените это:

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

на:

Intent i = new Intent(getApplicationContext(),SONR.class);
1 голос
/ 12 ноября 2015

Вы не должны вызывать getApplicationContext() внутри его открытого пустого конструктора, иначе он даст NullPointerException.

1 голос
/ 27 января 2014

getBaseContext () , который возвращает контекст, поскольку каждое действие расширяет класс контекста

1 голос
/ 29 ноября 2011

Вы утверждаете, что вам нужен контекст приложения, чтобы начать действие, неточно. Вы можете запустить действие из любого контекста , включая службу, которая является контекстом.

0 голосов
/ 28 ноября 2016

Просто сделайте это, чтобы получить доступ к контексту службы

Intent i = new Intent(Service.this, SONR.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
0 голосов
/ 02 декабря 2011
ctx.getApplicationContext().startActivity(i)

бум.

...