46

I am trying to autostart my nightclock application on charging using the following BroadcastReceiver implemented in the onPause() method:

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));

The onReceive() method is fired when the USB-cable is plugged in, but the activity doesn't start. However the log shows this:

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

Any ideas why the log says the activity is started, but nothing happens?

kablu
  • 629
  • 1
  • 7
  • 26
Gubbel
  • 2,327
  • 1
  • 24
  • 35

2 Answers2

24

If your goal is that you want NightClock to be started whenever an ACTION_POWER_CONNECTED broadcast is sent, your approach of using a BroadcastReceiver is fine. However, do not register it from an activity. Rather, register it in the manifest:

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

Then, have your BroadcastReceiver as a public Java class (here named OnPowerReceiver, though you can call it whatever you want), and have it call startActivity().

Bear in mind that users probably do not want you doing this. There are many other cases for connecting a phone to power besides starting a "night clock". I humbly suggest you simply let users start your activity via the home screen.

alfoks
  • 4,324
  • 4
  • 29
  • 44
CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • I've registered the `BroadcastReceiver` in the manifest like you said with this call in the `onReceive()` method: `context.startActivity(new Intent(context, NightClock.class));` But nothing happens when I connect the phone to power. Not even a log entry is added if I add `Log.d(this.toString(), "trying to start app ...");` to the method. – Gubbel Oct 03 '10 at 16:02
  • 2
    @Gubbel: Oops. Try ``. Most of the time, they do not have the `ACTION_` in the string, but apparently they do on this one. – CommonsWare Oct 03 '10 at 16:31
  • what will do, if application is removed from task list? Here message will not fire on your broadcast receiver. it will handle by "click_action" parameter. – Md. Sajedul Karim Nov 09 '16 at 13:00
  • you need to set flag `setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)` – Hasan A Yousef Feb 23 '17 at 20:47
-4

From Docs:

Do not start activities from broadcast receivers because the user experience is jarring; especially if there is more than one receiver. Instead, consider displaying a notification.

Ivan
  • 1,320
  • 16
  • 26
  • 6
    They override this in many default apps like alarms and incoming calls. So, if the user wants this to happen, it's his call. And your answer doesn't answer the question. – Dpedrinha Aug 22 '17 at 05:51
  • It is not possible to start activity from foreground service anymore, due to this advice.. time sensitive notification is needed and its action can start activity. If you try starting activity from background, system is not responding at all, except sometimes you are displayed with some not very readable error in logs :( – zeroDivider May 29 '23 at 10:10