Уведомление Резюме Активность - PullRequest
9 голосов
/ 25 августа 2010

Я знаю, что есть несколько вопросов этого типа, но я попробовал все это, и это все еще не работает.
Хорошо, для моего приложения;У меня есть активность.В этом упражнении есть 4 вкладки, а четвертая содержит список и кнопку записи.Когда я нажимаю кнопку записи, есть GPS-приемник, который запускается.Получив новое значение gps, он помещает его в список.
Пока это работает!
Если я нажму кнопку «Домой», она все равно будет работать, если я продолжаю удерживать ее нажатой.Он возобновляет действие с открытой вкладкой, а в списке по-прежнему содержатся элементы списка, а прослушиватель gps по-прежнему активен.
Это также отлично работает!
Теперь я хотел добавить уведомление, в котором отображается количество значений gps.списка как .number.При каждом новом сигнале GPS он обновляет значок уведомления новым номером.Это не проблема, но действие по нажатию на уведомление полностью испортило мое приложение.

Фактический код выглядит следующим образом:

public void callNotify(String text) {
    notif = new Notification();
    Intent contentIntent = new Intent(this, tabactivity.class);
    contentIntent.putExtra("fid", this.specialvalue);
    contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    notif.icon = R.drawable.icon;
    notif.setLatestEventInfo(this, getString(R.string.app_name), text,
        PendingIntent.getActivity(this.getBaseContext(), 0, contentIntent,
            PendingIntent.FLAG_UPDATE_CURRENT));
    notif.ledARGB = Color.RED;
    notif.ledOnMS = 200;
    notif.ledOffMS = 200;
    notif.flags = Notification.FLAG_SHOW_LIGHTS
        | Notification.FLAG_ONGOING_EVENT
        | Notification.FLAG_ONLY_ALERT_ONCE;
    notif.number = notifyNumber;
    mNotificationManager.notify(notifyNumber, notif);
}

public void updateNotify(String text) {
    notifyNumber++;
    notif.number = (int) (notifyNumber / 2);
    Intent contentIntent = new Intent(this, tabactivity.class);
    contentIntent.putExtra("fid", this.specialvalue);
    contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    notif.setLatestEventInfo(this, getString(R.string.app_name), text,
        PendingIntent.getActivity(this.getBaseContext(), 0, contentIntent,
            PendingIntent.FLAG_UPDATE_CURRENT));
    mNotificationManager.cancel((notifyNumber - 2));
    mNotificationManager.notify(notifyNumber, notif);
}

Итак, updateNotify () вызываетсяновый сигнал GPS.И callNotify () является первым, прежде чем он запускает прослушиватель GPS.И да, notifyNumber / 2 было моим намерением, потому что я продолжаю работать с этим номером.

Если я скомпилирую его таким образом и нажму на Уведомление, он откроет НОВУЮ вкладку на первой вкладке.Если я нажму назад, то получу много ошибок (база данных все еще открыта, нулевые указатели и прочее).Я думаю, потому что он запускает новую табачную активность, а другой все еще открыт, потому что я вижу, что слушатель gps все еще работает.

Итак, я хочу сделать следующее: я открываюмое приложение, перейдите на вкладку, откройте вкладку 4, нажмите запись.Если я нажму назад, оно должно скрыть приложение, если я просто нажму кнопку «Домой».Но есть уведомление.Если я нажму на него, он должен просто снова показать скрытую активность, вот и все.Итак, что я там делаю не так?Я думал, что флаги FLAG_ACTIVITY_CLEAR_TOP и FLAG_ACTIVITY_SINGLE_TOP должны решить проблему?

1 Ответ

6 голосов
/ 25 августа 2010

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

FLAG_ACTIVITY_SINGLE_TOP в соответствии с документами If set, the activity will not be launched if it is already running at the top of the history stack. Так что, если текущее действие не находится на вершине стека истории, оно будет перезапущено.

FLAG_ACTIVITY_CLEAR_TOP снова из документов If set, and the activity being launched is already running in the current task, then instead of launching a new instance of that activity, all of the other activities on top of it will be closed and this Intent will be delivered to the (now on top) old activity as a new Intent.

По умолчанию TabActivity всегда открывается на вкладке 0, вы можете использовать setDefaultTab, чтобы изменить это с помощью кода. Каждая вкладка в TabHost также является новой Intent

Если я скомпилирую это так и нажму на уведомлении, он открывает новый табуляция на первой вкладке. Если я нажмите тогда, я получаю много ошибок (база данных все еще открыта, нулевые указатели и прочее).

Это происходит Я думаю , потому что текущим Intent является tab4 (в действительности это # ​​3, 0,1,2,3), и ваше уведомление вызывает tabactivity.class. Так как он не активен или находится на вершине стека, все действия над ним закрываются, включая tab4.

Итак, я хочу, чтобы я мог сделать следующее: я открываю свое приложение, захожу на Tabactivity, откройте вкладку 4, нажмите запись. Если я нажму назад, он должен скрыть приложение также, если я просто нажму Главная кнопка. Но есть уведомление. Если я нажму на это, это должно просто показать скрытое активность снова и это все. И что Я там не так делаю? Я думал, что Флаги FLAG_ACTIVITY_CLEAR_TOP и FLAG_ACTIVITY_SINGLE_TOP должен решить проблема?

Вы путаете, что делают флаги и что происходит с клавишами home и back. Нажатие home скроет вашу активность, и уведомление должно работать с этими флагами (как только вы исправите проблему, о которой я упоминал ранее). Когда вы нажимаете back, Android заканчивает текущий Activity и снимает его со стека. Поскольку под ним ничего нет, вы вынуждены перезапускаться с нуля при нажатии на уведомление.

...