Chcę umieścić ikonę na pasku stanu, gdy tylko moja aplikacja jest uruchomiona, w tym gdy działa w tle. Jak mogę to zrobić?Jak wyświetlić ikonę na pasku stanu, gdy aplikacja jest uruchomiona, w tym w tle?
Odpowiedz
Powinieneś być w stanie to zrobić z zawiadomieniem a NotificationManager. Jednak uzyskanie gwarantowanego sposobu sprawdzenia, kiedy aplikacja nie działa, jest trudne.
Możesz uzyskać podstawową funkcjonalność, czego pragnie, wykonując coś takiego:
Notification notification = new Notification(R.drawable.your_app_icon,
R.string.name_of_your_app,
System.currentTimeMillis());
notification.flags |= Notification.FLAG_NO_CLEAR
| Notification.FLAG_ONGOING_EVENT;
NotificationManager notifier = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
notifier.notify(1, notification);
Kod ten musi być gdzieś, gdzie jesteś pewien, że będzie się zwolniony podczas uruchamiania aplikacji. Prawdopodobnie w niestandardowej metodzie aplikacji obiektu onCreate() obiektu aplikacji.
Jednak potem wszystko jest trudne. Zabicie aplikacji może się zdarzyć w każdej chwili. Możesz więc spróbować umieścić coś w onTerminate() klasy Application, ale nie ma gwarancji, że zostanie wywołana.
((NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE)).cancel(1);
będzie tym, co jest potrzebne, aby usunąć ikonę.
Zobacz przewodnik dla programistów "Creating Status Bar Notifications".
Jednym ze sposobów, aby osiągnąć cel, jakim jest utrzymanie ikonę tam tylko wtedy, gdy aplikacja jest uruchomiona jest zainicjować powiadomienie w onCreate()
i nazywają cancel(int)
w swojej metodzie onPause()
tylko jeśli isFinishing()
Zwraca true.
Przykład:
private static final int NOTIFICATION_EX = 1;
private NotificationManager notificationManager;
@Override
public void onCreate() {
super.onCreate();
notificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
int icon = R.drawable.notification_icon;
CharSequence tickerText = "Hello";
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
Context context = getApplicationContext();
CharSequence contentTitle = "My notification";
CharSequence contentText = "Hello World!";
Intent notificationIntent = new Intent(this, MyClass.class);
PendingIntent contentIntent = PendingIntent.getActivity(this,
0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle,
contentText, contentIntent);
notificationManager.notify(NOTIFICATION_EX, notification);
}
@Override
protected void onPause() {
super.onPause();
if (isFinishing()) {
notificationManager.cancel(NOTIFICATION_EX);
}
}
Wyświetli to tylko, jeśli dana aktywność jest uruchomiona. Nie, jeśli aplikacja nadal działa. –
@Greg: W porządku, ten przykładowy kod poprawnie obsługuje tylko jedną aplikację. O wiele trudniej jest ustalić, kiedy system zabił aplikację. Jak wspomniałeś, niestandardowa klasa "Application" jest prawdopodobnie najlepszym miejscem dla kodu, ponieważ trwa przez cały okres użytkowania aplikacji. Usunięcie powiadomienia będzie trudne, ponieważ system może arbitralnie zdecydować o zabiciu procesu aplikacji w warunkach niskiej ilości pamięci. Możesz spróbować utworzyć usługę monitorowania stanu, ponieważ system spróbuje ponownie uruchomić usługę później, gdy będzie dostępna większa ilość pamięci. – Brian
Jeśli usuniesz 'notificationManager.cancel (NOTIFICATION_EX);' z 'onPause' powiadomienie pozostanie na pasku powiadomień do momentu całkowitego zatrzymania aplikacji. –
Dla nowego API można użyć NotificationCompat.Builder
-
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Title");
Intent resultIntent = new Intent(this, MyActivity.class);
PendingIntent resultPendingIntent = PendingIntent.getActivity(
this,
0,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
Notification notification = mBuilder.build();
notification.flags |= Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT;
mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNotifyMgr.notify(NOTIFICATION_ID, notification);
To pokaże jak długo aplikacja jest uruchomiona, a ktoś ręcznie zamyka aplikację. Zawsze możesz anulować powiadomienie, dzwoniąc pod numer -
mNotifyMgr.cancel(NOTIFICATION_ID);
być treścią MyActivity.class? @mjosh –
@Sarahcartenz Wszystko, co naprawdę chcesz – mjosh
co jeśli nie zdefiniuję takiej klasy? lub pozostaw to puste. Nie chcę akcji po naciśnięciu powiadomienia na przykład. –
To naprawdę działa. utworzonego sposób z powyższego przykładu:
private void applyStatusBar(String iconTitle, int notificationId) {
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(iconTitle);
Intent resultIntent = new Intent(this, ActMain.class);
PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
Notification notification = mBuilder.build();
notification.flags |= Notification.FLAG_NO_CLEAR|Notification.FLAG_ONGOING_EVENT;
NotificationManager mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNotifyMgr.notify(notificationId, notification);}
Należy zwany jak: applyStatusBar Statusbar ("test", 10);
, jeśli mogę zapytać, jaka będzie zawartość ActMain.class? –
"Powiadomienie" zostało wycofane na poziomie interfejsu API 11. Zamiast tego użyj Powiadomienia.Builder. –
Jeśli używasz dodatkowo 'Service', nie musisz ręcznie usuwać notyfikacji.Gdy usługa zostanie zatrzymana, powiadomienie zostanie automatycznie usunięte. ("Jeśli jednak zatrzymasz usługę, gdy nadal działa na pierwszym planie, wówczas powiadomienie również zostanie usunięte." Https://developer.android.com/guide/components/services.html#Foreground) –