Android 由于 Activity 意图,通知点击导致应用程序崩溃

Android Notification tap cause crashes the app due to Activity intent

我有 MainActivityUserAcitivity,我已经通过意图将一些值传递给 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如果有其他最佳实践可以解决上述问题