Android 由于 Activity 意图,通知点击导致应用程序崩溃
Android Notification tap cause crashes the app due to Activity intent
我有 MainActivity
和 UserAcitivity
,我已经通过意图将一些值传递给 UserActivity
。
从 UserActivity
,我调用通知然后通知出现,我发出通知点按
通过 Pending Intent 启动 UserActivity
。当通知点击应用程序崩溃时,因为从 MainAcitvity
传递的值变为空。
我无法使用 SharedPreferences,因为另一个 UserAcitivity
的值冲突(传递的值对每个用户都是唯一的)
示例代码在这里:-
这是 MainAcitvity
public void buttonClick(View view){
Intent intent = new Intent(this,SecondActivity.class);
intent.putExtra("myname","ashiqueHira");
startActivity(intent);
}
这是SecondAcivity的Oncreate方法;
String heading= "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = getIntent();
heading = intent.getStringExtra("myname");
Toast.makeText(this, heading, Toast.LENGTH_SHORT).show();
}
这是我的通知方法
public void notificationPops(){
Intent intent = new Intent(this, SecondActivity.class);
createNotificationChannel();
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntentWithParentStack(intent);
Vibrator vibrator = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_vibration_black_24dp)
.setContentTitle("Token Reminder")
.setContentText("Dismiss the Alarm by Clicking this")
.setPriority(NotificationCompat.PRIORITY_MAX)
.setVibrate(new long[] { 100, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000 })
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
// Set the intent that will fire when the user taps the notification
.setContentIntent(pendingIntent)
.setAutoCancel(true);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(0, builder.build());
}
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel serviceChannel = new NotificationChannel(
CHANNEL_ID,
"myChannel",
NotificationManager.IMPORTANCE_HIGH
);
serviceChannel.enableVibration(true);
NotificationManager manager = getSystemService(NotificationManager.class);
manager.createNotificationChannel(serviceChannel);
}
}
这和我有类似的情况。不同之处在于我对 getIntent 值有很多用法
并且该值对于每个 Activity 都是唯一的。
提前致谢
所以,基本上你得到 NullPointerException
。为减少此问题,请更改 SecondActivity
代码,如下所示:
String heading= "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = getIntent();
if(intent.getStringExtra("myname")!= null){
heading = intent.getStringExtra("myname");
Toast.makeText(this, heading, Toast.LENGTH_SHORT).show();
}
}
这将减少您的 nullException 错误并且您的应用程序不会崩溃。
另一件事如果你总是需要通过意图传递标题值。然后也从通知 pendingIntent 传递值并从 SecondActivity
获取它
我通过添加和替换以下代码找到了解决这个问题的方法
在 notificationPops() 方法中
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("yourName",heading);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
当通知点击 activity 统计数据时,这将为您提供 activity 的价值。
请post如果有其他最佳实践可以解决上述问题
我有 MainActivity
和 UserAcitivity
,我已经通过意图将一些值传递给 UserActivity
。
从 UserActivity
,我调用通知然后通知出现,我发出通知点按
通过 Pending Intent 启动 UserActivity
。当通知点击应用程序崩溃时,因为从 MainAcitvity
传递的值变为空。
我无法使用 SharedPreferences,因为另一个 UserAcitivity
的值冲突(传递的值对每个用户都是唯一的)
示例代码在这里:- 这是 MainAcitvity
public void buttonClick(View view){
Intent intent = new Intent(this,SecondActivity.class);
intent.putExtra("myname","ashiqueHira");
startActivity(intent);
}
这是SecondAcivity的Oncreate方法;
String heading= "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = getIntent();
heading = intent.getStringExtra("myname");
Toast.makeText(this, heading, Toast.LENGTH_SHORT).show();
}
这是我的通知方法
public void notificationPops(){
Intent intent = new Intent(this, SecondActivity.class);
createNotificationChannel();
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntentWithParentStack(intent);
Vibrator vibrator = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_vibration_black_24dp)
.setContentTitle("Token Reminder")
.setContentText("Dismiss the Alarm by Clicking this")
.setPriority(NotificationCompat.PRIORITY_MAX)
.setVibrate(new long[] { 100, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000 })
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
// Set the intent that will fire when the user taps the notification
.setContentIntent(pendingIntent)
.setAutoCancel(true);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(0, builder.build());
}
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel serviceChannel = new NotificationChannel(
CHANNEL_ID,
"myChannel",
NotificationManager.IMPORTANCE_HIGH
);
serviceChannel.enableVibration(true);
NotificationManager manager = getSystemService(NotificationManager.class);
manager.createNotificationChannel(serviceChannel);
}
}
这和我有类似的情况。不同之处在于我对 getIntent 值有很多用法 并且该值对于每个 Activity 都是唯一的。 提前致谢
所以,基本上你得到 NullPointerException
。为减少此问题,请更改 SecondActivity
代码,如下所示:
String heading= "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = getIntent();
if(intent.getStringExtra("myname")!= null){
heading = intent.getStringExtra("myname");
Toast.makeText(this, heading, Toast.LENGTH_SHORT).show();
}
}
这将减少您的 nullException 错误并且您的应用程序不会崩溃。
另一件事如果你总是需要通过意图传递标题值。然后也从通知 pendingIntent 传递值并从 SecondActivity
我通过添加和替换以下代码找到了解决这个问题的方法 在 notificationPops() 方法中
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("yourName",heading);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
当通知点击 activity 统计数据时,这将为您提供 activity 的价值。
请post如果有其他最佳实践可以解决上述问题