通知单击: 活动已经打开

我有一个具有通知的应用程序,如果我单击它们,就会打开某个活动。我希望,如果我点击通知和活动已经打开,它的 没有再次启动,但只是带到前面。

我以为我可以用标志 FLAG_ACTIVITY_BROUGHT_TO_FRONTFLAG_ACTIVITY_REORDER_TO_FRONT来做,但是它一直打开它,所以我有两次活动。

这是我的暗号:

event_notification = new Notification(R.drawable.icon,
mContext.getString(R.string.event_notif_message), System.currentTimeMillis());
Intent notificationIntent = new Intent(mContext, EventListActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
sendNotification(event_notification, notificationIntent, mContext.getString(R.string.event_notif_title),
body, Utils.PA_NOTIFICATIONS_ID);

我可以用标志来管理它吗? 或者我应该在 SharedPreferences 中存储一个变量来检查它是否打开了?

谢谢!

90594 次浏览

您需要将 ActivitylaunchMode属性设置为 singleTop。这将导致传入的意图被传递到现有实例,而不是在 Activity已经位于任务堆栈顶部时启动新实例。

这是在清单中通过将 android:launchMode="singleTop"添加到 <activity>元素来完成的。要访问最新的意图(如果您对随之传入的任何数据感兴趣) ,请在 Activity中覆盖 onNewIntent()

尝试将标志设置为 Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP

来自 FLAG _ ACTIVITY _ CLEAR _ TOP 的文档(强调地雷) :

如果设置了,则正在启动的活动已经在 当前任务,而不是启动该任务的新实例 活动,所有其上的活动将被关闭和 这个意图将作为一个 新意图

例如,考虑一个由活动组成的任务: A、 B、 C、 D。 如果 D 调用 startActivity () ,并使用解析为 活动 B 的组成部分,然后 C 和 D 将完成和 B 收到 给定的意图,导致堆栈现在是: A,B。

上面示例中活动 B 的当前运行实例将 要么接受你在这里开始的新意图 方法,或者自己完成并用新的 如果它已经声明其启动模式为“多重”( 缺省值) ,并且没有将 FLAG _ ACTIVITY _ SINGLE _ TOP 设置为相同的 意图,然后它将被完成和重新创建; 对于所有其他启动 如果设置了 FLAG _ ACTIVITY _ SINGLE _ TOP,则此意图将为 传递到当前实例的 onNewInent () .

Notification.Builder mBuilder =
new Notification.Builder(this)
.setSmallIcon(R.drawable.cmplayer)
.setContentTitle("CoderoMusicPlayer")
.setContentText("PLayer0!");


Intent resultIntent = new Intent(this,


AndroidBuildingMusicPlayerActivity.class);
resultIntent.setAction(Intent.ACTION_MAIN);
resultIntent.addCategory(Intent.CATEGORY_LAUNCHER);


PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
resultIntent, 0);


mBuilder.setContentIntent(pendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNotificationManager.notify(1, mBuilder.build());

只需复制代码并粘贴到您的主启动器活动。

这是原始答案

使用 onNewIntent()处理通知单击和刷新活动中的新数据。

onNewIntent中,从新意图(由新通知提供)获取新数据并捕获它们,例如:

title = intent.getStringExtra("title")

onCreate前情提要:)

它将使用新的通知数据刷新当前活动。

您也可以遵循 本教程。

我认为你应该增加一些逻辑,使其工作,也许这可以帮助:

例如,我有一个应用程序的启动器和主屏幕:

public class SplashScreen extends AppCompatActivity {
private final int TIME_OUT = 2000;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);


// Suscribirse al tema Notificaciones
FirebaseMessaging.getInstance().subscribeToTopic("NOTA");
if (getIntent().getExtras() != null) {
if (getIntent().getExtras().size()>1){
Intent home_activity = new Intent(getApplicationContext(), Home.class);
home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
if (getIntent().getExtras() != null) {
for (String key : getIntent().getExtras().keySet()) {
String value = "" + getIntent().getExtras().getString(key);
Log.d("TAG", key + "=" + value);
switch (key) {
case "url":
home_activity.putExtra("url", value);
break;
}
}
}
startActivity(home_activity);
finish();


}else{
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
try {
Intent home_activity = new Intent(getApplicationContext(), Home.class);
home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(home_activity);
finish();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}, TIME_OUT);
}




} else {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
try {
Intent home_activity = new Intent(getApplicationContext(), Home.class);
home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(home_activity);
finish();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}, TIME_OUT);
}


}


}

在我的 FirebaseService 中,我做了以下工作:

public class FCMessagingService extends FirebaseMessagingService {


private final String TAG = "PUSH";
private String body = "";
private static String _url = "";
private static int numMessage = 0;


@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);


String from = remoteMessage.getFrom();
Log.d(TAG, "Mensaje recibido de: " + from);


if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Notificación: " + remoteMessage.getNotification().getBody());


if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Data: " + remoteMessage.getData());
try {
JSONObject data = new JSONObject(remoteMessage.getData());
String url = data.getString("url");
Log.d(TAG, "onMessageReceived: \n" + "Extra Information: " + url);
this._url = url;
Log.d("_URL",_url);
mostrarNotificacion(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
mensaje(url, remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
} catch (JSONException e) {
e.printStackTrace();
}
}
}






}




private void mensaje(String url, String title, String body){
boolean acti =  Util.comprobarActivityALaVista(getApplicationContext(), "com.dev.android.subagan.MainActivity");
if(acti){


Intent imain = new Intent(MainActivity.URL);


imain.putExtra("key_url",url);
imain.putExtra("key_title",title);
imain.putExtra("key_body",body);


LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(imain);


}else{


Intent ihome = new Intent(Home.URL);


ihome.putExtra("key_url",url);
ihome.putExtra("key_title",title);
ihome.putExtra("key_body",body);
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(ihome);


}


}








private void mostrarNotificacion(String title, String body) {


final int NOTIFICATION_ID = 3000;


Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("url",_url);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);




PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT  );






Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);


NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(body)
.setAutoCancel(true)
.setSound(soundUri)
.setTicker(body)
.setContentIntent(pendingIntent);


NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());


}


}
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(this, new Random().nextInt(), intent, 0);