0

В настоящий момент активность уничтожается, но значок статуса по-прежнему отображается в строке состояния. Вы можете помочь мне удалить значок в то же время, когда приложение закрывается? Я подозреваю, что проблема раздела onDestroy ... Информация LogCat заключается в том, что у меня есть исключение nullpointer в строке
notificationManager.cancel (NOTIF_ID);NullPointerException удалить значок строки состояния

private static final int NOTIF_ID = 1; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_jajko); 

text = (TextView) findViewById(R.id.tvTime); 
play = (Button) findViewById(R.id.butStart); 

miekko = (Button) findViewById(R.id.butMiekko); 
srednio = (Button) findViewById(R.id.butSrednio); 
twardo = (Button) findViewById(R.id.butTwardo); 

miekko.setOnClickListener(this); 
srednio.setOnClickListener(this); 
twardo.setOnClickListener(this); 
play.setOnClickListener(this); 

mp = MediaPlayer.create(Jajko.this, R.raw.alarm); 

showNotification(this); 
} 


public static void showNotification(Context context) { 
    final Intent result_intent = new Intent(context, Jajko.class); 

    result_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 



TaskStackBuilder stack_builder = TaskStackBuilder.create(context); 
stack_builder.addParentStack(Jajko.class); 
stack_builder.addNextIntent(result_intent); 


PendingIntent pending_intent = stack_builder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

android.support.v4.app.NotificationCompat.Builder builder = new android.support.v4.app.NotificationCompat.Builder(context); 

Resources res = context.getResources(); 
builder.setContentIntent(pending_intent) 
    .setSmallIcon(R.drawable.icon) 
    .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.icon)) 
    .setTicker("test") 
    .setWhen(System.currentTimeMillis()) 
    .setAutoCancel(false) 
    .setContentTitle("title") 
    .setContentInfo("cinfo") 
    .setContentText("ctext"); 
Notification n = builder.build(); 
n.flags = Notification.FLAG_ONGOING_EVENT; 

NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); 


nm.notify(NOTIF_ID, n);  
} 

public void onDestroy() { 
try { 
    mp.release(); 
    if (isFinishing()) { 
     notificationManager.cancel(NOTIF_ID); 
    } 
} catch (Exception e) { 
} 
super.onDestroy(); 

} 

Logcat

09-30 17:24:51.052: E/AndroidRuntime(5200): FATAL EXCEPTION: main 
09-30 17:24:51.052: E/AndroidRuntime(5200): java.lang.RuntimeException: Unable to destroy activity {com.flex_bak.eggcook/com.example.eggcook.Jajko}: java.lang.NullPointerException 
09-30 17:24:51.052: E/AndroidRuntime(5200):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2693) 
09-30 17:24:51.052: E/AndroidRuntime(5200):  at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2711) 
09-30 17:24:51.052: E/AndroidRuntime(5200):  at android.app.ActivityThread.access$2100(ActivityThread.java:121) 
09-30 17:24:51.052: E/AndroidRuntime(5200):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:976) 
09-30 17:24:51.052: E/AndroidRuntime(5200):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-30 17:24:51.052: E/AndroidRuntime(5200):  at android.os.Looper.loop(Looper.java:130) 
09-30 17:24:51.052: E/AndroidRuntime(5200):  at android.app.ActivityThread.main(ActivityThread.java:3701) 
09-30 17:24:51.052: E/AndroidRuntime(5200):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-30 17:24:51.052: E/AndroidRuntime(5200):  at java.lang.reflect.Method.invoke(Method.java:507) 
09-30 17:24:51.052: E/AndroidRuntime(5200):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
09-30 17:24:51.052: E/AndroidRuntime(5200):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 
09-30 17:24:51.052: E/AndroidRuntime(5200):  at dalvik.system.NativeStart.main(Native Method) 
09-30 17:24:51.052: E/AndroidRuntime(5200): Caused by: java.lang.NullPointerException 
09-30 17:24:51.052: E/AndroidRuntime(5200):  at com.example.eggcook.Jajko.onDestroy(Jajko.java:260) 
09-30 17:24:51.052: E/AndroidRuntime(5200):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2680) 
09-30 17:24:51.052: E/AndroidRuntime(5200):  ... 11 more 
+0

Опубликовать свой журнал cat. –

+0

-1 za NPE we własny kodzie! 'notificationManager' jest nullem ... aw Twoim kodzie nie ma nic gdzie tą zmienną inicjalizujesz ani deklarujesz ... bez magicznej kuli nie da rady – Selvin

+1

@Selvin English please ... – codeMagic

ответ

1

Из кода вы в курсе, это не выглядит как notificationManager инициализируется в любом месте, которое, безусловно, будет давать NPE. Я даже не вижу, чтобы это объявлялось, но я полагаю, что это происходит потому, что это, вероятно, сделано до onCreate(), и это нормально.

Возможно, вы имели в виду nm вместо notificationManage, потому что вы это инициализируете. Если вы думаете, что это произошло, пожалуйста, покажите, где вы думаете, что вы его инициализируете.

Вы также можете проверить, если он null перед входом в if заявление в случае, если она становится null до того onDestroy() называется.

+0

Я объявляю в основном классе private NotificationManager notificationManager; а также инициализирован NotificationManager nm = (NotificationManager) context.getSystemService (Context.NOTIFICATION_SERVICE); nm.notify (NOTIF_ID, n); при методе showNoticication(). Это неправильно? Как это должно быть сделано правильно? – bakusek

+0

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

+0

Я обнародовал NotificationManager notificationManager; \t public static final int NOTIF_ID = 1; и теперь у меня нет никаких ошибок, но значок моей строки состояния приложения по-прежнему отображается, даже если я нажму кнопку «Назад», которая должна быть вызвана методом уничтожения. – bakusek

0

UPDATE

Просто измените эту строку:

NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); 

к этому

nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); 

и он должен работать :-)

Я думаю, что ваш notificationManager никогда не инициированы или его уже уничтожен до того, как вы пройдете методDestroy. Включить nullcheck, чтобы избежать этого исключения:

public void onDestroy() { 
try { 
mp.release(); 
if (isFinishing()) { 
if (null != notificationManager) 
    notificationManager.cancel(NOTIF_ID); 
} 
} catch (Exception e) { 
} 
super.onDestroy(); 

} 
Смежные вопросы