OnPause()メソッドに実装された次のBroadcastReceiverを使用して、充電時に夜間時計アプリケーションを自動起動しようとしています。
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));
USBケーブルが接続されるとonReceive()メソッドが起動しますが、アクティビティは開始されません。ただし、ログには次のように表示されます。
I/ActivityManager( 79): Starting activity: Intent { flg=0x10000000 cmp=com.meins.nightclock/.NightClock }
ログにアクティビティが開始されたと表示される理由はありますが、何も起こりませんか?
_ACTION_POWER_CONNECTED
_ブロードキャストが送信されるたびにNightClock
を開始することが目標である場合、BroadcastReceiver
を使用するアプローチは適切です。ただし、アクティビティから登録しないでください。むしろ、マニフェストに登録してください:
_<receiver Android:name=".OnPowerReceiver">
<intent-filter>
<action Android:name="Android.intent.action.ACTION_POWER_CONNECTED" />
</intent-filter>
</receiver>
_
次に、BroadcastReceiver
をpublic Javaクラス(ここではOnPowerReceiver
という名前にしますが、必要に応じて呼び出すことができます)として)、_startActivity()
。
ユーザーはおそらくこれを行うことを望まないことに留意してください。 「夜の時計」を開始する以外にも、電話を電源に接続する他の多くのケースがあります。ユーザーにホーム画面からアクティビティを開始させることをお勧めします。
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);
}
もちろん動作しますが、パッケージとアクティビティクラスの名前を自分のものに変更する必要があります。