Kliknij powiadomienie: aktywność już otwarta
Mam aplikację z powiadomieniami, które otwierają określoną aktywność, jeśli je kliknę. Chcę, aby, jeśli kliknę powiadomienie, a aktywność jest już otwarta, to nie zaczęło się ponownie, ale po prostu zostało przeniesione do przodu.
Myślałem, że mogę to zrobić z flagą FLAG_ACTIVITY_BROUGHT_TO_FRONT
lub FLAG_ACTIVITY_REORDER_TO_FRONT
, ale ciągle ją otwiera, więc mam aktywność dwa razy.
To jest mój kod:
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);
Czy Mogę nim zarządzać za pomocą flag, czy powinienem zapisać zmienną w SharedPreferences, aby sprawdzić, czy otwarte czy nie?
Dzięki!6 answers
Musisz ustawić launchMode
atrybut Activity
, który zaczynasz singleTop
. Spowoduje to, że przychodzące intencje będą dostarczane do istniejącej instancji zamiast rozpoczynać nową instancję, gdy Activity
znajduje się już na szczycie stosu zadania.
Odbywa się to w manifeście przez dodanie android:launchMode="singleTop"
do elementu <activity>
. Aby uzyskać dostęp do najnowszej intencji (jeśli jesteś zainteresowany jakimikolwiek danymi, które mogły zostać przekazane wraz z nią), Nadpisz onNewIntent()
w swoim Activity
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-20 19:16:32
Spróbuj zamiast tego ustawić flagi na Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP
.
Z dokumentacji dla FLAG_ACTIVITY_CLEAR_TOP (podkreślenie):
Jeśli jest ustawione, a uruchamiana aktywność jest już uruchomiona w bieżącego zadania, wtedy zamiast uruchamiać nową instancję tego działalności, wszystkie pozostałe działania na jej szczycie zostaną zamknięte i zamiar ten zostanie dostarczony do (teraz na górze) starej działalności jako nowe intencje.
Na przykład, rozważmy zadanie składająca się z czynności: A, B, C, D. Jeśli D wywoła funkcję startActivity () z intencją, która rozwiązuje Składnik działania B, następnie C i D zostaną zakończone, a b otrzymają podaną intencją, w wyniku czego stos teraz wynosi: A, B.
Aktualnie uruchomiona instancja aktywności B w powyższym przykładzie będzie albo otrzymać nowy zamiar zaczynasz tutaj w jego metoda onNewIntent (), lub być sama zakończona i uruchomiona ponownie z nową intencja. Jeśli zadeklarował swój start mode to be " multiple "(the domyślnie) i nie ustawiłeś FLAG_ACTIVITY_SINGLE_TOP w tym samym intencji, wtedy zostanie on ukończony i ponownie utworzony; dla wszystkich innych uruchomień modes or if FLAG_ACTIVITY_SINGLE_TOP is set then this Intent will be dostarczone do bieżącej instancji onnewintent ().
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-20 19:19:52
Użyj onNewIntent()
do obsługi nowych danych z powiadomień kliknij i odśwież aktywność.
W onNewIntent
Uzyskaj nowe dane z nowej intencji (która była obsługiwana przez nowe powiadomienie) i złap je, na przykład:
title = intent.getStringExtra("title")
W onCreate
poprzednio :)
Odświeży bieżącą aktywność o nowe dane powiadomień.
Możesz również postępować zgodnie z tym samouczkiem: http://androidrace.com/2016/12/10/how-to-refresh-activity-on-new-notification-click-android-developer/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-10 21:48:20
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());
Po prostu skopiuj kod i wklej go do głównej aktywności launchera.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:03
Myślę, że powinieneś dodać trochę logiki, aby to działało, może to pomoże:
Na przykład mam ekran powitalny (Launcher i główny) aplikacji:
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);
}
}
}
I w moim FirebaseService zrobiłem następujące:
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());
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-02 22:02:45
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(this, new Random().nextInt(), intent, 0);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-28 00:21:22