从服务中的BroadcastReceiver启动活动

时间:2013-08-01 19:14:10

标签: android android-intent

我试图在服务和广播接收器的帮助下在某个时间开始活动。问题是,一旦时间到了,我的应用就会崩溃。

这是扩展Service的我的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 ));     
}

我认为它不起作用的原因是因为我已经有一个意图过滤器来使手机振动。 不知道还有什么做或如何改变它。

我想要做的是,创建一个闹钟,一旦一次击中,我希望它开始响铃,然后开始一个显示贪睡的活动。

它现在振动的原因是每次我试图测试它时都不响。

任何提示和建议将不胜感激。谢谢。

编辑:

我尝试过使用flag activity new task,这是我的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 cs.AlarmManagerService$1@42093aa0
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 个答案:

答案 0 :(得分:3)

要在Activity Activity之外启动Context,您需要使用标记FLAG_ACTIVITY_NEW_TASK。将其添加到您的Intent

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

如果这不能解决您的问题,那么请发布logcat。

Intent

答案 1 :(得分:0)

我想指出,从后台开始活动对用户来说并不是一次很棒的体验。假设用户正在进行其他一些工作?任意开始一项新活动至少是一种烦恼。

我认为您应该做的是从您的服务发送通知,内容Intent会导致您要启动的活动。这使用户可以选择在通知出现后立即转到活动,或等到他们完成当前工作后再进行活动。

也许我误解了你想做什么,但你可能想考虑修改你的应用程序设计。

Notifications API指南更详细地讨论了这一点。还有一个名为Notifying the User

的Android培训课程