web-dev-qa-db-ja.com

BroadcastReceiverからのstartActivity()

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 }

ログにアクティビティが開始されたと表示される理由はありますが、何も起こりませんか?

37
Gubbel

_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()

ユーザーはおそらくこれを行うことを望まないことに留意してください。 「夜の時計」を開始する以外にも、電話を電源に接続する他の多くのケースがあります。ユーザーにホーム画面からアクティビティを開始させることをお勧めします。

19
CommonsWare

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

もちろん動作しますが、パッケージとアクティビティクラスの名前を自分のものに変更する必要があります。

57
Sathish