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); 
相關問題