2010-10-03 118 views
28

我试图自动启动使用)在的onPause实施(以下BroadcastReceiver的方法充电我nightclock应用:startActivity()从广播接收器

BroadcastReceiver test = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     unregisterReceiver(this); 
     Intent i = new Intent(context, NightClock.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 
    }   
}; 
registerReceiver(test, new IntentFilter(Intent.ACTION_POWER_CONNECTED)); 

的的onReceive()方法时,会引发USB电缆是插入,但该活动未启动。然而,日志显示了这一点:

I/ActivityManager( 79): Starting activity: Intent { flg=0x10000000 cmp=com.meins.nightclock/.NightClock } 

任何想法为什么日志说活动已开始,但没有任何反应?

+0

请更新您的问题,更多来自LogCat - 此行之前的几行以及此行之后的十几行。另外,为什么'FLAG_ACTIVITY_NEW_TASK'?还有,当ACTION_POWER_CONNECTED发生时,注册此'BroadcastReceiver'的活动还在吗? – CommonsWare 2010-10-03 13:50:23

+0

连接电源时,LogCat中没有更多行。 'BroadcastReceiver'被注册在它应该开始的同一个活动中。此活动仍在后台运行(LogCat应用程序已置于前台)。如果这个活动在任务管理器中被终止,那么'BroadcastReceiver'似乎根本不会被触发。这种方法是否从一开始就错误地自动启动我的应用程序? – Gubbel 2010-10-03 14:47:20

回答

16

如果您的目标是您希望在发送ACTION_POWER_CONNECTED广播时启动NightClock,则您使用BroadcastReceiver的方法没问题。但是,不要从活动注册它。相反,它注册在清单:

<receiver android:name=".OnPowerReceiver"> 
     <intent-filter> 
       <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> 
     </intent-filter> 
</receiver> 

然后,有你BroadcastReceiver作为公共Java类(这里命名OnPowerReceiver,但你可以调用它任何你想要的),并调用它startActivity()

请记住,用户可能不希望你这样做。除了启动“夜钟”之外,还有许多其他情况可用于将手机连接到电源。我虚心地建议你只是让用户通过主屏幕开始你的活动。

+0

我已经在'onReceive()'方法中用这个调用所说的清单中注册了'BroadcastReceiver':'context.startActivity(new Intent(context,NightClock.class));'但是当我连接手机通电。如果我添加Log.d(this.toString(),“尝试启动应用程序...”),则甚至不会添加日志条目。 – Gubbel 2010-10-03 16:02:13

+2

@Gubbel:哎呀。尝试''。大多数情况下,他们在字符串中没有“ACTION_”,但显然他们在这个字符串上。 – CommonsWare 2010-10-03 16:31:40

+0

它的工作原理!谢谢。 – Gubbel 2010-10-03 16:43:05

46

你必须作为参数传递给onRecieve()方法的上下文,所以只需使用:

@Override 
public void onReceive(Context context, Intent intent) { 
    //start activity 
    Intent i = new Intent(); 
    i.setClassName("com.test", "com.test.MainActivity"); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 
} 

它的工作原理,当然你必须改变包装和活动类名到您自己的。

+2

为什么downvote?这不好吗?它帮助我+1,因为我没有发现这是一个糟糕的做法。 – Mafro34 2013-11-20 15:13:57

+0

@ Mafro34我只是尝试了相同的方法,我认为这不理想的原因是他设置的标志。因为除非这是你想要的(运行一项新任务),否则它可能会严重地扰乱你的应用程序逻辑 - 无论如何它都会与我的应用程序逻所以除非这是你想要的,否则我建议找另一种方法。 – AgentKnopf 2014-07-21 14:29:19

+5

@AgentKnopf看起来你没有太多选择:(从http://developer.android.com/reference/android/content/Context.html#startActivity%28android.content.Intent,%20android.os.Bundle %29): “请注意,如果从Activity Context以外调用此方法,那么Intent必须包含FLAG_ACTIVITY_NEW_TASK启动标志,这是因为,不从现有的Activity启动,不存在任何现有任务放置新的活动,因此需要将其放置在自己独立的任务中。“ – aberaud 2016-01-13 23:22:16

-3

Docs

,因为用户体验是不和谐的,不要从广播接收机开始活动;特别是如果有多个接收器的话。相反,请考虑显示通知。

+0

它们在许多默认应用程序(如闹钟和来电)中覆盖此设置。所以,如果用户希望这种情况发生,那就是他的电话。你的回答并不回答这个问题。 – Dpedrinha 2017-08-22 05:51:46