2013-08-01 140 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