9

このタイプの質問がいくつかあることは知っていますが、すべて試してみましたが、それでも機能しません。
はい、私のアプリです。アクティビティがあります。このアクティビティには4つのタブがあり、4番目のタブにはリストと記録ボタンが含まれています。レコードをプッシュしていると、GPSリスナーが起動します。新しいgps値を取得した後、それをリストにプッシュします。
これは今のところうまくいきます!
ホームボタンをクリックしても機能しますが、長押しすると機能します。特定のタブを開いた状態でアクティビティが再開され、リストには引き続きリストアイテムが保持され、gpsリスナーはアクティブなままです。
これも問題なく動作します!
ここで、リストのgps値の数を.numberとして表示する通知を追加したいと思いました。新しいgps信号ごとに、通知アイコンが新しい番号で更新されます。これは問題ありませんが、通知をクリックするアクションは私のアプリケーションを完全に台無しにします。

実際のコードは次のようになります。

public void callNotify(String text) {
    notif = new Notification();
    Intent contentIntent = new Intent(this, tabactivity.class);
    contentIntent.putExtra("fid", this.specialvalue);
    contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    notif.icon = R.drawable.icon;
    notif.setLatestEventInfo(this, getString(R.string.app_name), text,
        PendingIntent.getActivity(this.getBaseContext(), 0, contentIntent,
            PendingIntent.FLAG_UPDATE_CURRENT));
    notif.ledARGB = Color.RED;
    notif.ledOnMS = 200;
    notif.ledOffMS = 200;
    notif.flags = Notification.FLAG_SHOW_LIGHTS
        | Notification.FLAG_ONGOING_EVENT
        | Notification.FLAG_ONLY_ALERT_ONCE;
    notif.number = notifyNumber;
    mNotificationManager.notify(notifyNumber, notif);
}

public void updateNotify(String text) {
    notifyNumber++;
    notif.number = (int) (notifyNumber / 2);
    Intent contentIntent = new Intent(this, tabactivity.class);
    contentIntent.putExtra("fid", this.specialvalue);
    contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    notif.setLatestEventInfo(this, getString(R.string.app_name), text,
        PendingIntent.getActivity(this.getBaseContext(), 0, contentIntent,
            PendingIntent.FLAG_UPDATE_CURRENT));
    mNotificationManager.cancel((notifyNumber - 2));
    mNotificationManager.notify(notifyNumber, notif);
}

したがって、updateNotify()は新しいgpsシグナルで呼び出されます。そして、callNotify()は、gpsリスナーを開始する前の最初のものです。そして、ええ、notifyNumber / 2は私の意図でした。なぜなら、私はその番号をさらに処理するからです。

このようにコンパイルして通知をクリックすると、最初のタブに新しいタブアクティビティが開きます。そのときクリックすると、多くのエラーが発生します(データベースはまだ開いている、nullpointersなど)。新しいタブアクティビティが開始され、もう1つはまだ開いているので、'gpsリスナーがまだ機能していることがわかります。

だから、私が欲しいのは、次のことができるということです。アプリを開き、タブアクティビティに移動し、タブ4を開き、[レコード]をクリックします。そのときクリックすると、アプリが非表示になります。ホームボタンをクリックするだけでも表示されます。しかし、通知があります。それをクリックすると、非表示のアクティビティが再び表示されるはずです。それで、私がそこで間違っていることは何ですか?フラグFLAG_ACTIVITY_CLEAR_TOPとFLAG_ACTIVITY_SINGLE_TOPで問題が解決するはずだと思いましたか?

4

1 に答える 1

6

ここで起こっていることは少し混乱しているので、ここで私に耐えてください。

FLAG_ACTIVITY_SINGLE_TOPドキュメントによるとIf set, the activity will not be launched if it is already running at the top of the history stack.、現在のアクティビティが履歴スタックの一番上にない場合は、再起動されます。

FLAG_ACTIVITY_CLEAR_TOP再びドキュメントからIf set, and the activity being launched is already running in the current task, then instead of launching a new instance of that activity, all of the other activities on top of it will be closed and this Intent will be delivered to the (now on top) old activity as a new Intent.

デフォルトでは、TabActivityは常にタブ0に開きます。これを使用setDefaultTabして、コードを介して変更できます。TabHostの各タブも新しいものですIntent

このようにコンパイルして通知をクリックすると、最初のタブに新しいタブアクティビティが開きます。そのときクリックすると、多くのエラーが発生します(データベースはまだ開いている、nullpointersなど)。

これが起こっているのは、現在がtab4(実際にはその#3、0、1、2、3)であり、通知によってが表示されているためだと思います。それはアクティブではないか、スタックの一番上にないので、tab4を含め、その上のすべての行為は閉じられます。Intenttabactivity.class

だから、私が欲しいのは、次のことができるということです。アプリを開き、タブアクティビティに移動し、タブ4を開き、[レコード]をクリックします。そのときクリックすると、アプリが非表示になります。ホームボタンをクリックするだけでも表示されます。しかし、通知があります。それをクリックすると、隠された活動性が再び表示されるはずです。それで、私がそこで間違っていることは何ですか?フラグFLAG_ACTIVITY_CLEAR_TOPとFLAG_ACTIVITY_SINGLE_TOPで問題が解決するはずだと思いましたか?

homeフラグが何をするのか、そしてキーで何が起こるのか混乱していbackます。ヒットhomeするとアクティビティが非表示になり、通知はこれらのフラグで正常に機能するはずです(前述の問題を修正した後)。ただし、ヒットするとback、Androidは現在のデータを終了Activityし、スタックから削除します。その下には何もないので、通知を押すと最初から再起動する必要があります。

于 2010-08-25T15:36:28.220 に答える