Android 应用程序崩溃..意图标志?
Android app crash.. intent flag?
我的应用最近发生了一些崩溃,我想知道这是否可能是由于 intents 上的标志造成的。
当崩溃发生时,我相信应用程序会在休息计时器期间关闭。打开一个片段,然后用户可以单击开始,这将启动一个 90 秒的倒计时计时器。当计时器结束时,用户会收到一条通知,单击该通知会使用户返回到打开的片段。错误不是经常发生,我不能每次都重新创建它。
这是堆栈跟踪:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.content.ComponentName.<init>(ComponentName.java:77)
at android.content.Intent.<init>(Intent.java:4913)
at com.bestworkouts.sheikoworkout.Workouts.Week1Mon.showNotification(Week1Mon.java:171)
at com.bestworkouts.sheikoworkout.Workouts.Week1Mon.onFinish(Week1Mon.java:147)
at android.os.CountDownTimer.handleMessage(CountDownTimer.java:127)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
这是错误所在的通知(它说错误在 Intent intent = new Intent(getActivity(), MyWorkout.class):
public void showNotification() {
NotificationCompat.Builder builder = new NotificationCompat.Builder(getContext());
builder.setSmallIcon(R.drawable.sheikoicon);
builder.setContentTitle("Sheiko Rest Timer");
builder.setContentText("Rest timer is up, start your set!");
builder.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE);
builder.setAutoCancel(true);
Intent intent = new Intent(getActivity(), MyWorkout.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(getContext());
stackBuilder.addParentStack(MyWorkout.class);
stackBuilder.addNextIntent(intent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
NotificationManager NM = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
NM.notify(0, builder.build());
}
我在哪里启动倒数计时器并调用 showNotification:
private void start() {
cancel();
mCountDownTimer = new CountDownTimer(90000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
txtViewRest.setText(millisUntilFinished / 1000 + " Secs");
}
@Override
public void onFinish() {
txtViewRest.setText("Start!");
showNotification();
}
}.start();
}
我想知道这是否与我的FLAG_ACTIVITY_CLEAR_TOP有关?
感谢帮助!
由于您的代码在另一个线程上 运行,如果在 CountDownTimer
完成时 Fragment
已因任何原因关闭,getActivity()
和getContext()
将 return null
.
您应该将上下文保存在 Fragment
的 onCreate
:
private Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context= getContext();
// Your code here
}
然后在你的 showNotification()
方法中使用它:
public void showNotification() {
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(R.drawable.sheikoicon);
builder.setContentTitle("Sheiko Rest Timer");
builder.setContentText("Rest timer is up, start your set!");
builder.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE);
builder.setAutoCancel(true);
Intent intent = new Intent(context, MyWorkout.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(MyWorkout.class);
stackBuilder.addNextIntent(intent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
NotificationManager NM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NM.notify(0, builder.build());
}
我的应用最近发生了一些崩溃,我想知道这是否可能是由于 intents 上的标志造成的。
当崩溃发生时,我相信应用程序会在休息计时器期间关闭。打开一个片段,然后用户可以单击开始,这将启动一个 90 秒的倒计时计时器。当计时器结束时,用户会收到一条通知,单击该通知会使用户返回到打开的片段。错误不是经常发生,我不能每次都重新创建它。
这是堆栈跟踪:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.content.ComponentName.<init>(ComponentName.java:77)
at android.content.Intent.<init>(Intent.java:4913)
at com.bestworkouts.sheikoworkout.Workouts.Week1Mon.showNotification(Week1Mon.java:171)
at com.bestworkouts.sheikoworkout.Workouts.Week1Mon.onFinish(Week1Mon.java:147)
at android.os.CountDownTimer.handleMessage(CountDownTimer.java:127)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
这是错误所在的通知(它说错误在 Intent intent = new Intent(getActivity(), MyWorkout.class):
public void showNotification() {
NotificationCompat.Builder builder = new NotificationCompat.Builder(getContext());
builder.setSmallIcon(R.drawable.sheikoicon);
builder.setContentTitle("Sheiko Rest Timer");
builder.setContentText("Rest timer is up, start your set!");
builder.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE);
builder.setAutoCancel(true);
Intent intent = new Intent(getActivity(), MyWorkout.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(getContext());
stackBuilder.addParentStack(MyWorkout.class);
stackBuilder.addNextIntent(intent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
NotificationManager NM = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
NM.notify(0, builder.build());
}
我在哪里启动倒数计时器并调用 showNotification:
private void start() {
cancel();
mCountDownTimer = new CountDownTimer(90000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
txtViewRest.setText(millisUntilFinished / 1000 + " Secs");
}
@Override
public void onFinish() {
txtViewRest.setText("Start!");
showNotification();
}
}.start();
}
我想知道这是否与我的FLAG_ACTIVITY_CLEAR_TOP有关?
感谢帮助!
由于您的代码在另一个线程上 运行,如果在 CountDownTimer
完成时 Fragment
已因任何原因关闭,getActivity()
和getContext()
将 return null
.
您应该将上下文保存在 Fragment
的 onCreate
:
private Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context= getContext();
// Your code here
}
然后在你的 showNotification()
方法中使用它:
public void showNotification() {
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(R.drawable.sheikoicon);
builder.setContentTitle("Sheiko Rest Timer");
builder.setContentText("Rest timer is up, start your set!");
builder.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE);
builder.setAutoCancel(true);
Intent intent = new Intent(context, MyWorkout.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(MyWorkout.class);
stackBuilder.addNextIntent(intent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
NotificationManager NM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NM.notify(0, builder.build());
}