2

アラーム マネージャーとブロードキャスト レシーバーを使用する目覚まし時計アプリがあります。アプリは 1 つのアクティビティと 4 つのフラグメントです。アラームが鳴ると、onReceive メソッドがインテントをメイン アクティビティに送信します。メイン アクティビティは、メソッド onNewIntent でこのインテントを受け取り、正しいフラグメントに移動します。アプリを閉じた後にアラームが鳴った場合を除いて、すべて正常に動作します。

アプリを破棄すると、アラームは鳴り続け、ブロードキャスト レシーバーからのインテントが起動しますが、onNewIntent メソッドはインテントをキャッチし、アプリを正しいフラグメントに移動します。

これは、メイン アクティビティに移動するブロードキャスト レシーバー クラスにあるインテントです。

Intent alarmIntent = new Intent( context, ClockActivity.class );
                alarmIntent.addFlags(Intent.FLAG_FROM_BACKGROUND);
                alarmIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                alarmIntent.putExtra("Alarm Name", receivedAlarm.getmName());
                context.startActivity(alarmIntent);

これは、アプリが閉じられたときにアラームが呼び出されたときに呼び出されないメインアクティビティの onNewIntent メソッドです。

    @Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    PhraseFragment phraseFragment = new PhraseFragment();

    String activeName = intent.getStringExtra("Alarm Name");

    Bundle args = new Bundle();
    args.putString("activeName", activeName);
    phraseFragment.setArguments(args);

    getFragmentManager().beginTransaction()
            .replace(R.id.container, phraseFragment)
            .addToBackStack("phrase")
            .commit();

}
4

1 に答える 1

0

少し遅れていますが、これは誰かを助けることができるかもしれません。

ご覧のとおり、アクティビティがバックグラウンドで開かれると、onNewIntent が呼び出されます。バックグラウンドで実行されていないアクティビティにインテントを送信すると、onResume() で getIntent を介して取得できます。

コードを次のように変更します。

@Override
protected void onResume() {
    super.onResume();

    Intent intent = getIntent();
    String activeName = intent.getStringExtra("Alarm Name");

    if (activeName != null){
        PhraseFragment phraseFragment = new PhraseFragment();

        Bundle args = new Bundle();
        args.putString("activeName", activeName);
        phraseFragment.setArguments(args);

        getFragmentManager().beginTransaction()
                .replace(R.id.container, phraseFragment)
               .addToBackStack("phrase")
               .commit();
     }
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

この場合、 onResume() で受け取ったインテントに必要なデータが含まれているかどうかを確認する必要があります。

ドキュメントでこれへの参照が見つからないことに注意してください。それは私が実験して得た結論にすぎません。

于 2015-07-21T20:19:50.193 に答える