0

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

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

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

我想要做的是,创建一个闹钟,一旦时间到了,我希望它开始响起,然后开始一个显示贪睡的活动。

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

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

编辑:

我试过使用标志活动新任务,这是我的日志:

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

编辑2:

好的,经过更多研究,我尝试了:

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

这一次,它奏效了。谢谢你所有的时间!

4

2 回答 2

3

要从Activity外部开始,Activity Context您需要使用 flag FLAG_ACTIVITY_NEW_TASK。将此添加到您的Intent

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

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

意图

于 2013-08-01T19:17:43.087 回答
0

我想指出,从后台启动活动对用户来说并不是一个很好的体验。假设用户正在进行其他工作?随意开始一个新的 Activity 至少是一件烦人的事。

我认为你应该做的是从你的服务发送一个通知,内容意图导致你想要开始的活动。这使用户可以选择在通知出现后立即前往活动,或者等到他们完成当前工作后再前往活动。

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

通知API 指南更详细地讨论了这一点。还有一个名为Notifying the User的 Android 培训课程

于 2013-08-01T19:45:18.273 回答