5

解決できない 2 つのアクティビティに関する問題があります。

アラーム マネージャーでアラームをプログラムする A アクティビティがあり、3 秒後にアラーム レシーバーが終了ボタンのみを持つ B アクティビティを起動します。

A からアラーム マネージャーをプログラムし、[戻る] ボタンを押してこのアクティビティを終了すると、3 秒後に B アクティビティが表示されます。すべて正常です。問題は次のとおりです。ランチャーでアプリケーションを再度開くと、システムは A アクティビティを開始しますが、ホーム ボタンを長押ししてアプリケーションを起動すると (最近使用したタスク)、常に B アクティビティを開きます。B アクティビティが終了したら、どこからでもアプリケーションを再度開くと、A アクティビティが開く必要があります。

アクティビティ B に noHistory を追加しようとしましたが、問題は続きます。

A アクティビティのコードは次のとおりです。

public class ActivityA extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);

    Button b=(Button) findViewById(R.id.initTimer);
    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            programTimer();
        }
    });
}

private void programTimer() {
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, AlarmReciver.class);
    PendingIntent pIntent = PendingIntent.getBroadcast(this, 1, intent,  PendingIntent.FLAG_CANCEL_CURRENT);
    manager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+3000 , pIntent);
}

}

B 活動:

public class ActivityB extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);

    Button button= (Button) findViewById(R.id.bFinish);
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

}

アラームレシーバー:

public class AlarmReciver extends android.content.BroadcastReceiver {
private static final String DEBUG_TAG="ReceptorAlarma";
@Override
public void onReceive(Context context, android.content.Intent intent) {     
    //lanzar activity
    Intent i = new Intent(context, ActivityB.class); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);       
}

}

マニフェスト:

    <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".ActivityA"
        android:label="@string/title_activity_activity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".ActivityB">            
    </activity>

    <receiver android:name=".AlarmReciver" >
    </receiver>
</application>

御時間ありがとうございます。

4

1 に答える 1

1

あなたが書いた:

A からアラーム マネージャーをプログラムし、[戻る] ボタンを押してこのアクティビティを終了すると、3 秒後に B アクティビティが表示されます。すべて正常です。

注:これで、ルート アクティビティとして ActivityB を持つ 1 つの実行中のタスクができました。

問題は次のとおりです。ランチャーでアプリケーションを再度開くと、システムが A アクティビティを開始し、

注:ランチャーからアプリケーションを起動すると、ActivityA をルート アクティビティとする別のタスクが開始されます。これで、2 つの実行中のタスクができました。1 つは root としての ActivityA で、もう 1 つは ActivityB です。

...しかし、ホームボタン (最近使用したタスク) を長押ししてアプリケーションを起動すると、常に B アクティビティが開きます。

注: HOME ボタンを長押しして最近使用したタスクから選択すると、ActivityB をルートとする AlarmReciver によって開始されたタスクが選択されます。

B アクティビティが終了したら、どこからでもアプリケーションを再度開くと、A アクティビティが開く必要があります。

<activity>ActivityB のタグに次のように設定することで、必要な動作を取得できるはずです。

android:excludeFromRecents="true"

これにより、ActivityB をルート アクティビティとしてタスクを開始したときに、そのタスクが最近のタスクのリストに表示されなくなります。このように、アプリケーションを起動する唯一の方法は、ホーム画面から、または最近のタスクのリスト (ルートとして ActivityA で開始されたタスクのみを保持します) から選択することです。

于 2012-12-20T16:37:18.230 に答える