由于 Activity 意图,Android 通知点击导致应用程序崩溃
Posted
技术标签:
【中文标题】由于 Activity 意图,Android 通知点击导致应用程序崩溃【英文标题】:Android Notification tap cause crashes the app due to Activity intent 【发布时间】:2020-11-25 19:48:57 【问题描述】:我有MainActivity
和UserAcitivity
,我已经通过意图将一些值传递给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 上显示通知