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

Posted

技术标签:

【中文标题】由于 Activity 意图,Android 通知点击导致应用程序崩溃【英文标题】:Android Notification tap cause crashes the app due to Activity intent 【发布时间】:2020-11-25 19:48:57 【问题描述】:

我有MainActivityUserAcitivity,我已经通过意图将一些值传递给UserActivity。 从UserActivity,我打电话给通知然后通知出现了,我让通知点击到 通过待定意图启动UserActivity。当通知点击应用程序崩溃,因为从MainAcitvity 传递的值变为空。 我不能使用 SharedPreferences,因为另一个 UserAcitivity 的值冲突(传递的值对于每个用户都是唯一的)

示例代码在这里:- 这是主要活动

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 值有很多用途 并且该值对于每个活动都是唯一的。 提前致谢

【问题讨论】:

如果在将用户名提供给通知之前将其添加到pendingIntent 会怎样?比如:pendingIntent.putExtra("myname","ashiqueHira"); 我无法将 putExtra 提供给 pendingIntent。请告诉我该怎么做。提前致谢 你为什么不能给putExtra 我试图将 pendingIntent.putExtra 放在上面显示的 PendingIntent 声明下方。但它无法解决。 (显示错误) 您好@BrunoBieri 感谢您的回复我通过使用这个'Intent intent = new Intent(this, SecondActivity.class); 解决了这个问题; intent.putExtra("你的名字",heading);' 'PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);' 【参考方案1】:

所以,基本上你会得到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 获取它

【讨论】:

感谢您的回复,如何从 PendingIntent 传递值? 在您的NotificationPos 方法中,在Intent intent = new Intent(this, SecondActivity.class); 之后添加这一行intent.putExtra("myname","ashiqueHira") 非常感谢,我知道了【参考方案2】:

我通过添加和替换以下代码找到了解决此问题的方法 在 notificationPops() 方法中

Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("yourName",heading);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, 
intent, PendingIntent.FLAG_UPDATE_CURRENT);

当活动通过通知点击统计时,这将为您提供活动的价值。

如果有其他解决上述问题的最佳实践,请发布

【讨论】:

以上是关于由于 Activity 意图,Android 通知点击导致应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

android.net.wifi.STATE_CHANGE意图处理(在Activity中)

全屏意图未启动活动,但确实在 android 10 上显示通知

具有相同意图的推送通知打开 Activity

如何从后台服务的全屏意图通知Android中打开活动

Android 深度链接。从历史记录打开应用程序时,意图不会重置

活动中的旧意图从通知开始