Открыть любую активность из уведомления [дубликат]

«ОШИБКИ» являются наиболее полезными для разработчиков, чтобы знать их ошибки и разрешать их, чтобы система работала идеально.

PHP предоставляет некоторые из лучших способов узнать разработчиков, почему и где их кусок кода получает ошибки, поэтому, зная эти ошибки, разработчики могут сделать свой код лучше во многих отношениях.

Лучшие способы записи следующих двух строк в верхней части скрипта для получения всех сообщений об ошибках:

error_reporting(E_ALL);
ini_set("display_errors", 1);

Другой способ использования инструментов отладчика, таких как xdebug в вашей среде IDE.

129
задан Jonik 30 October 2013 в 11:56
поделиться

6 ответов

Вам нужно установить атрибут launchMode в Activity, который вы начинаете с singleTop. Это приведет к тому, что входящие Intents будут доставлены в существующий экземпляр вместо запуска нового экземпляра, если этот Activity уже находится в верхней части стека задачи.

Это делается в манифесте, добавляя android:launchMode="singleTop" к элементу <activity>. Чтобы получить доступ к последнему намерению (если вас интересуют любые данные, которые могли пройти с ним), переопределите onNewIntent() в Activity.

238
ответ дан Devunwired 22 August 2018 в 04:31
поделиться
  • 1
    Это сработало. Благодаря! – PX Developer 20 August 2012 в 20:58
  • 2
    Я столкнулся с множеством ответов, в которых говорилось о значении намерения для разных вещей. Это не сработало. Это потому, что намерение, независимо от его флага, переходит к вновь созданной деятельности? Я спрашиваю, потому что Devunwired сказал, что атрибут launchMode изменяется, когда Intents доставляются. – lululoo 15 March 2013 в 09:55
  • 3
    он отлично работает. Благодарю. – iDroid Explorer 30 April 2013 в 06:36
  • 4
    Страница документации находится на странице developer.android.com/guide/topics/manifest/… – Mifeng 17 June 2013 в 14:28
  • 5
    Спасибо огромное! – Alexander Meiler 16 August 2014 в 14:58

Используйте onNewIntent() для обработки новых данных из уведомлений, нажмите и обновите активность.

В onNewIntent получите новые данные из нового намерения (которые обслуживаются новым уведомлением) и поймают их, например:

title = intent.getStringExtra("title")

в onCreate ранее :)

Он обновит текущую активность новыми уведомлениями.

Вы также можете следовать этому руководству: http://androidrace.com/2016/12/10/how-to-refresh-activity-on-new-notification-click-android-developer/

4
ответ дан Andrii Omelchenko 22 August 2018 в 04:31
поделиться

Я думаю, вы должны добавить некоторую логику, чтобы заставить ее работать, может быть, это может помочь:

Например, у меня есть экран заставки (Launcher и MAIN) APP:

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());

    }

}
-1
ответ дан Carlos Alberto Gonzalez 22 August 2018 в 04:31
поделиться
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());

Просто скопируйте код и вставьте его в свою основную активность.

Вот оригинальный ответ

2
ответ дан Community 22 August 2018 в 04:31
поделиться
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(this, new Random().nextInt(), intent, 0);
0
ответ дан Haroldo Gondim 22 August 2018 в 04:31
поделиться
  • 1
    Пожалуйста, объясните, как ваш код помогает решить проблему, указанную в вопросе. Это может быть не очевидно для других читателей, сталкивающихся с теми же / подобными проблемами. – NOhs 27 June 2018 в 12:10

Попробуйте установить флаги на 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 в приведенном выше примере либо получит новое намерение, которое вы начинаете здесь, в его onNewIntent (), или сами закончите и перезапустите с новым намерением. Если он объявил свой режим запуска «множественным» (по умолчанию), и вы не установили FLAG_ACTIVITY_SINGLE_TOP в одном и том же намерении, он будет завершен и заново создан; для всех других режимов запуска или если установлен FLAG_ACTIVITY_SINGLE_TOP, этот Intent будет доставлен в onNewIntent () текущего экземпляра.

27
ответ дан user113215 22 August 2018 в 04:31
поделиться
  • 1
    Это то, что мне нужно. Просто добавьте описание, которое нужно добавить в этот флаг: new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP). – Morteza Rastgoo 1 August 2016 в 12:29
Другие вопросы по тегам:

Похожие вопросы: