通知发送文本到 Activity 问题

Notification Send Text to Activity Issue

最近,我一直在仔细研究这两个问题和尝试拥有多个通知的问题的解决方案,每个通知都有自己的活动,从各自相应的通知中获取 String extras。

How to pass text from notification to another activity? How to send parameters from a notification-click to an activity?

除了一个关键问题外,当前的解决方案大部分都有效: 当应用程序未打开时,我收到两个不同的通知。我单击以打开通知详细信息 activity,activity 中的文本更新得很好。然而,在保持相同 activity 的同时,我点击了第二个通知,但没有任何反应。

当应用程序打开时,此解决方案工作正常。它使用两个不同的通知文本视图打开两个单独的意图。如果应用程序关闭,我退出第一个通知查看详细信息 activity 然后打开第二个,它也很好地完成了解决方案。

如有任何帮助,我们将不胜感激!

这是我的代码:

主要活动class

private NotificationManager notificationManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

public void setAlarm1(View view){
    Toast.makeText(getApplicationContext(),"Setting Alarm 5 seconds",Toast.LENGTH_SHORT).show();
    //this is 5 seconds
    long alertTime = new GregorianCalendar().getTimeInMillis();
    alertTime += 5*1000;


    Intent alertIntent = new Intent(this,AlertReceiver.class);
    alertIntent.putExtra("msg","This is msg for 5 seconds");
    alertIntent.putExtra("msgText","This is msgText for 5 seconds");
    alertIntent.putExtra("msgAlert","This is msgAlert for 5 seconds");
    alertIntent.putExtra("notifyID",1);

    AlarmManager alarmManager = (AlarmManager)
            getSystemService(Context.ALARM_SERVICE);

    alarmManager.set(AlarmManager.RTC_WAKEUP,alertTime,
            PendingIntent.getBroadcast(this,1,alertIntent,
                    0));

}

public void setAlarm2(View view){
    Toast.makeText(getApplicationContext(),"Setting Alarm 10 seconds",Toast.LENGTH_SHORT).show();
    //this is 5 seconds
    long alertTime = new GregorianCalendar().getTimeInMillis();
    alertTime += 10*1000;


    Intent alertIntent = new Intent(this,AlertReceiver.class);
    alertIntent.putExtra("msg","This is msg for 10 seconds");
    alertIntent.putExtra("msgText","This is msgText for 10 seconds");
    alertIntent.putExtra("msgAlert","This is msgAlert for 10 seconds");
    alertIntent.putExtra("notifyID",2);

    AlarmManager alarmManager = (AlarmManager)
            getSystemService(Context.ALARM_SERVICE);

    alarmManager.set(AlarmManager.RTC_WAKEUP,alertTime,
            PendingIntent.getBroadcast(this,2,alertIntent,
                    0));

}

AlertReceiver class

public class AlertReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    createNotification(context, intent.getStringExtra("msg"), intent.getStringExtra("msgText"), intent.getStringExtra("msgAlert"), intent.getIntExtra("notifyID",999));

}

public void createNotification(Context context, String msg, String msgText, String msgAlert, int notifyID){
    Intent intent = new Intent(context, MoreInfoNotification.class);
    intent.putExtra("msg",msg);
    intent.putExtra("msgText",msgText);
    intent.putExtra("msgAlert",msgAlert);
    // had this below line of code but made problems worse
    // intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent notificIntent = PendingIntent.getActivity(context, notifyID,
            intent,PendingIntent.FLAG_UPDATE_CURRENT);


    NotificationCompat.BigTextStyle style = new NotificationCompat.BigTextStyle();
    style.setBigContentTitle(msg);
    style.bigText(msgText);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder.setContentTitle(msg);
    builder.setContentText(msgText);
    builder.setSmallIcon(R.mipmap.ic_launcher);
    builder.setTicker(msgAlert);


    builder.setStyle(style);

    builder.setContentIntent(notificIntent);


    builder.setDefaults(NotificationCompat.DEFAULT_SOUND);
    builder.setAutoCancel(true);

    NotificationManager mNotificationManager =
            (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(notifyID,builder.build());

}
}

更多信息通知class

public class MoreInfoNotification extends AppCompatActivity {

private TextView mTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    onNewIntent(getIntent());

}

@Override
public void onNewIntent(Intent intent) {
    // TODO Auto-generated method stub
    Bundle extras = getIntent().getExtras();
    if(extras != null){

        setContentView(R.layout.activity_more_info_notification);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mTextView = (TextView)findViewById(R.id.textView);
        String totalString = "";

        if(extras.containsKey("msg")){
            totalString += extras.getString("msg");
        }
        if(extras.containsKey("msgText")){
            totalString += ", " + extras.getString("msgText");
        }
        if(extras.containsKey("msgAlert")){
            totalString += ", " + extras.getString("msgAlert");
        }

        mTextView.setText(totalString);
    }
}
}

所以我最近找到了这个问题的答案。意图被视为相同而不是分开的,这正是我一直在寻找的。为了使意图不被视为重复,我写了这一行:

    intent.setAction("com.wordpress.zackleaman.materialtablayout.intent.action.ACTION_NAME" + notifyID);

在我的 AlertReceiver class 中,createNotification 方法,就在我将附加内容放入我的意图之后。

我知道最好的方法是使用: PendingIntent.getActivity(上下文, 0, 意图,PendingIntent.FLAG_UPDATE_CURRENT);

与:intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);

但是,无论我尝试了多少种不同的解决方案,如果我打开了第一个通知详细信息并在应用程序最初关闭时单击打开了第二个通知详细信息,我都无法更新文本。