2013-08-01 224 views
0

我試圖在服務和broadcastreceiver的幫助下,在特定時間開始一項活動。問題是,一旦時間到了,我的應用程序崩潰。從BroadcastReceiver開始從事服務活動

下面是延伸服務 假定一切正常,除了在代碼中陳述的意圖我AlarmService類。

public void onCreate(){ 

    audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); 
    Intent i = new Intent(this, GoTime.class); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    myReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context c, Intent i) {  

      if(checkquery((currentTime < (startTime)))){ 

      // RINGER is set to Vibrate. 
      audioManager.setRingerMode(1); 

      startActivity(i); //This crashes the app. If i take out this, everything works. 
      } 
     } 
    }; 

    registerReceiver(myReceiver, new IntentFilter("setVibrate"));      
    alarmManager = (AlarmManager)(this.getSystemService(Context.ALARM_SERVICE));  
} 

我認爲它不工作的原因是因爲我已經有一個意圖過濾器來使手機振動。 不知道還有什麼做或如何改變它。

什麼,我試圖做的是,創造一個鬧鐘,一旦時間打,我希望它開始響個不停,然後開始將顯示貪睡的活動。

它現在振動的原因就是這樣,每當我試圖測試它時,它都不響。

任何提示和建議,將不勝感激。謝謝。

編輯:

我一直在使用該標誌的活動新任務試過了,這是我的logcat:

08-01 15:23:00.508: E/AndroidRuntime(2244): FATAL EXCEPTION: main 
08-01 15:23:00.508: E/AndroidRuntime(2244): java.lang.RuntimeException: Error receiving broadcast Intent { act=setVibrate flg=0x14 (has extras) } in [email protected] 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:768) 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at android.os.Handler.handleCallback(Handler.java:725) 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at android.os.Looper.loop(Looper.java:137) 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at android.app.ActivityThread.main(ActivityThread.java:5293) 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at dalvik.system.NativeStart.main(Native Method) 
08-01 15:23:00.508: E/AndroidRuntime(2244): Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at android.app.ContextImpl.startActivity(ContextImpl.java:1235) 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at android.app.ContextImpl.startActivity(ContextImpl.java:1222) 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at android.content.ContextWrapper.startActivity(ContextWrapper.java:291) 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at cs.AlarmManagerService$1.onReceive(AlarmManagerService.java:70) 
08-01 15:23:00.508: E/AndroidRuntime(2244):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:758) 
08-01 15:23:00.508: E/AndroidRuntime(2244):  ... 9 more 

EDIT2:

好了,所以經過一些研究,我想:

Intent mIntent = new Intent(getBaseContext(), GoTime.class); 
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
getApplication().startActivity(mIntent); 

這次,它工作。 謝謝你的所有時間!

回答

2

要啓動Activity以外的ActivityContext您需要使用標記FLAG_ACTIVITY_NEW_TASK。添加到您的Intent

Intent in = new Intent(this, GoTime.class); 
in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

如果這不能解決您的問題,那麼請張貼logcat的。

Intent

+0

我已經更新了我的職位與你的建議,與logcat的錯誤一起。 – nub

+1

用新代碼運行應用程序後,這是一個新的logcat嗎? – codeMagic

+0

是的,先生,這是添加i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)後新的logcat; 原因可能是這樣的:「新的IntentFilter(」setVibrate「)」,我不能調用2接收onReceive? – nub

0

我想指出的是,從背景開始活動,是不是爲用戶帶來極大的體驗。假設用戶正在進行其他一些工作?任意開始一個新的活動至少是一個煩惱。

我認爲你應該做的是從你的服務發送通知,與內容意圖導致要啓動活動。這樣,用戶就可以選擇在通知出現後立即轉到活動,或者等到他們完成當前工作後再進入活動。

也許我誤解你想做的事,但你可能要考慮修改您的應用程序的設計。

Notifications API指南對此進行了更詳細的討論。還有一個Android培訓課程叫Notifying the User

+0

我想要做的是在正確的時間點響後發出警報,然後開始一個用戶可以點擊貪睡按鈕的活動。我現在設置爲振動的唯一原因是每當我測試它時它都不響 – nub