1

したがって、このアプリケーションは 1 つの 2 つのアクティビティで構成されています。1 つ目は、通知の作成に関する仕様をユーザーに尋ねます。ボタンをクリックすると、アクティビティが通知を作成します。このアクティビティのコードは次のとおりです。

package com.dewey.notifymanager;

import java.util.Random;


import android.os.Bundle;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Button button = (Button) findViewById(R.id.button1);
        final TextView texty = (TextView) findViewById(R.id.textView2);
        final EditText input = (EditText) findViewById(R.id.editText1);
        final EditText input2 = (EditText) findViewById(R.id.editText2);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                String notificationmessage = input.getText().toString();
                String notificationdetails = input2.getText().toString();
                texty.setText("Notification Created");
                displayNotification(notificationmessage, notificationdetails);
            }
        });
    }
    @Override
    protected void onStart() {

    super.onStart();


    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }



    public void displayNotification(String msg,String details)
    {

         NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
         Notification notification = new Notification(R.drawable.ic_launcher, msg, System.currentTimeMillis());

        Random generator = new Random();
        int i = 90686958 - generator.nextInt(92938);


        Intent intent = new Intent(this, ResultActivity.class);
        intent.putExtra("details", details);
        intent.putExtra("msg", msg);
        intent.putExtra("id", i);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
        notification.setLatestEventInfo(this, msg, details, pendingIntent);
        notification.flags = notification.FLAG_ONGOING_EVENT;
        manager.notify(i, notification);








    }

}

通知がクリックされると、新しいアクティビティが起動され、通知 ID を含むいくつかのデータがインテントで渡されます。2 番目のアクティビティは、通知に含まれていたデータを表示し、ボタンも備えています。ユーザーがこのボタンをクリックすると、通知が削除されます。2 番目のアクティビティのコードは次のとおりです。

package com.dewey.notifymanager;

import android.os.Bundle;
import android.app.Activity;
import android.app.NotificationManager;
import android.content.Context;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class ResultActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(null);
        setContentView(R.layout.activity_result);

        String details = getIntent().getExtras().getString("details");
        String msg = getIntent().getExtras().getString("msg");
        final int id = getIntent().getExtras().getInt("id");
        TextView title = (TextView)findViewById(R.id.title);
        TextView descrip = (TextView)findViewById(R.id.details);
        title.setText(msg);
        descrip.setText(details);

        Button exitButton = (Button)findViewById(R.id.exitButton);
        exitButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                NotificationManager notificationManager = (NotificationManager) 

              getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.cancel(id);
            finish();

            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_result, menu);
        return true;
    }
}

アプリを実行すると、奇妙な動作をします。通知を作成してクリックすると、2 番目のアクティビティが起動され、正しいデータが表示され、完了ボタンによって通知がステータス バーから削除されます。しかし、2 番目の通知を作成してクリックすると、2 番目のアクティビティが起動されますが、最初のアプリケーションに含まれていた古いデータが表示されます。これが起こらないようにする必要があります。

これまでのところ、アクティビティがsavedInstanceStateを再開しているという事実に問題があると思いますが、2番目のアクティビティで「null」に設定しました。私の問題は正確には何ですか?

アクティビティがsavedInstanceStateを再開することに関する問題ですか、それとも私のロジックですか?

助けてくれてありがとう。

4

2 に答える 2

3

から起動されたものはアプリケーションコンテキストの外部から来るため、FLAG_ACTIVITY_NEW_TASKフラグをPendingIntent作成に追加する必要があります。したがって、次のようにコードを変更します。ActivityNotification

PendingIntent pendingIntent =
    PendingIntent.getActivity(this, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

さらに、すでにサポート ライブラリを使用していることに気付きました。廃止されたプラクティスであるusingの代わりに using に移行することを強くお勧めします。次のコードは、サポート ライブラリのビルダー API を使用して、同じ を作成します。Notification.BuildersetLatestEventInfo()Notification

NotificationManager manager =
    (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

Random generator = new Random();
int i = 90686958 - generator.nextInt(92938);

Intent intent = new Intent(this, ResultActivity.class);
intent.putExtra("details", details);
intent.putExtra("msg", msg);
intent.putExtra("id", i);
PendingIntent pendingIntent =
    PendingIntent.getActivity(this, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setTicker(msg);
builder.setSmallIcon(R.drawable.ic_launcher);

builder.setContentTitle(msg);
builder.setContentText(details);
builder.setContentIntent(pendingIntent);

Notification notification = builder.build();
manager.notify(i, notification);

補足として、階層ナビゲーションを実装する予定がある場合はTaskStackBuilder、サポート ライブラリの を使用して を構築することも検討してください。PendingIntent

編集

一度に複数の作成に関する 2 番目の質問についてNotification。まず第一に、これは必ずしも良いパターンではないと言わざるを得ません。アプリケーションは、デバイスのウィンドウ シェードを複数の項目で汚染する習慣を身につけるべきではありません。それらを凝縮すると、ユーザーは感謝します。

PendingIntentただし、より正確に言えば、以前のインスタンスと同じアクション、データ、ターゲットなどで作成されたインスタンスは、最初のインスタンスを単に置き換えて、2 番目のインスタンスを作成しないため、それを機能させることはできません。これを回避する方法の 1 つは、渡したのと同じ一意の ID をNotificationManager使用し、それを のリクエスト コードとしても使用することPendingIntentです。

PendingIntent pendingIntent =
    PendingIntent.getActivity(this, i, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

これにより、PendingIntent作成したそれぞれが、正しいデータを送信するのに十分なほど一意になります。

于 2013-01-12T05:23:21.443 に答える
0

最初のアクティビティで履歴書を次のように処理しようとすることができます

OnResume()
{
super.onresume();
 NotificationManager notificationManager = (NotificationManager) 

              getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.cancel(id);
}  

で 2 番目のアクティビティを終了したら、最初のアクティビティで on resume メソッドを入力する必要があります。

于 2013-01-11T22:36:47.833 に答える