1

我正在製作一個應用程序,提醒我每隔10分鐘(遠離計算機)休息一下,每隔一小時(休息10分鐘,由加速度計跟蹤)。Android環境爲空?

該應用程序使用AlarmManager來安排警報。您必須按開始按鈕來安排警報。每隔10分鐘,ShortBreakNotif廣播就會被解僱。每個小時,BreakNotifService都會被觸發。 (我縮短了這些測試時間)。

ShortBreakNotif和BreakNotifService都需要啓動MusicService。所以,因爲有兩個位置需要用於startService()的musicIntent,所以我試圖只在TimerViewActivity中創建musicIntent並使其可用於TimerViewActivity onDestroy方法。這是做到這一點的正確方法嗎?它不起作用(TimerViewActivity,251行):

musicIntent = new Intent(TimerViewActivity.this, MusicService.class); 

看起來上下文爲空。那可能是因爲活動尚未完全初始化?如果musicIntent僅在幾秒鐘後創建,那怎麼可能呢?它說: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference

getApplicationContext()也不起作用。導致這個錯誤:java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference

我應該怎麼做?

下面是完整的項目:https://github.com/felixglusch/AccelTimer/tree/master/app/src/main/java/com/example/felix/acceltimer

如果您對代碼有任何疑問,請詢問。

+0

我認爲你必須創建在接收一個意圖,一個在服務和不要試圖在活動封裝,因爲環境會有所不同。 – GSala

回答

0

您不應該通過構造函數創建活動。例如,在這種情況下,你應該使用上下文參數,而不是新建一個TimerViewActivity.java(你是對的,將不會正確初始化)。

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    Log.i("BroadCastNotif", "**** BROADCAST ****"); 

    Notif notification = new Notif(); 
    notification.notifyUser(context); 

    TimerViewActivity tva = new TimerViewActivity(); 
    Intent musicIntent = tva.getNewMusicServiceIntent(); 
    context.startService(musicIntent); 
} 

你應該做的事:

Intent musicIntent = new Intent(context, MusicService.class); 
+0

謝謝!這就是我最初的想法,但認爲在一個地方做'新的Intent(context,MusicService.class)'可能會更好。 –