单击通知时打开错误的活动

Posted

技术标签:

【中文标题】单击通知时打开错误的活动【英文标题】:Wrong Activity is getting openned on clicking Notification 【发布时间】:2019-09-04 00:03:23 【问题描述】:

点击通知后,错误的 Activity 被打开 - 主应用程序 Activity,但不是我的目标 Activity - NearPhotoActivity。

创建通知:

    public static Notification createNotification(Location location) 
        NotificationChannel mChannel = new NotificationChannel(
                "3000", "notification_channel", NotificationManager.IMPORTANCE_LOW);
        notificationManager.createNotificationChannel(mChannel);
        return buildNotification("Notification Title",
                "Notification Body",
                true,
                R.drawable.ic_mr_button_connecting_00_dark,
                createPendingIntent(NearPhotoActivity.class, location),
                mChannel);
    

创建 PendingIntent:

    private static PendingIntent createPendingIntent(Class destinationActivityClass, Location location) 
        Intent intent = new Intent(MyApplication.getAppContext(),
                destinationActivityClass);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intent.putExtra("nearLocation", location);
        return PendingIntent
                .getActivity(MyApplication.getAppContext(),
                        0,
                        intent,
                        PendingIntent.FLAG_CANCEL_CURRENT);
    

应该打开的活动:

@RequiresApi(api = Build.VERSION_CODES.O)
public class NearPhotoActivity extends AppCompatActivity 
    private ImageView nearPhotoImageView;
    private TextView locationDescriptionTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_near_photo);

        onNewIntent(getIntent());


        nearPhotoImageView = findViewById(R.id.nearPhotoImageView);

        locationDescriptionTextView = findViewById(R.id.locationDescriptionTextView);
    

    @Override
    protected void onNewIntent(Intent intent) 
        if(intent.getExtras().containsKey("nearLocation")) 
            Location location = (Location) intent.getExtras().getSerializable("nearLocation");
            //Address address = MyAppUtils.getLocation(location.getLatitude(),location.getLongitude());
            locationDescriptionTextView.setText("You are " + location.distanceTo(MyApplication.getCurrentLocation()) + " meters");
        
    

【问题讨论】:

【参考方案1】:

打开了错误的活动,因为您在启动应用程序时在Mainfest 中将MainActivity 设置为默认值。

您应该在MainActivity 中添加onNewIntent 函数,而不是在NearPhotoActivity 中。

MainActivity

override fun onNewIntent(intent: Intent?) 
    super.onNewIntent(intent)
    receiveIntent(intent)


fun receiveIntent(intent: Intent?) 
   Location location = (Location) intent.getExtras().getSerializable("nearLocation");
   Intent i = newIntent(MainActivity.this,NearPhotoActivity.class)
   i.putExtra("location",location)
   startActivity(i)

然后使用getExtra 获取location 类中的location

【讨论】:

在我的 MainActivity 中处理 onNewIntent 没有任何意义,因为我需要在 NearPhotoActivity 中添加额外内容,因为位置从那里提供 TextView 组件。 我猜它会返回JSON而不是位置对象? 不,它会返回有效的 Location 对象,现在一切正常。

以上是关于单击通知时打开错误的活动的主要内容,如果未能解决你的问题,请参考以下文章

单击推送通知时如何打开活动?

单击推送通知时对特定活动的意图。

单击本地通知时无法打开现有的正在运行的活动

单击 fcm 通知而不是打开启动器活动时打开浏览器

单击服务生成的通知时,即使已经打开,主 Activity 也会再次打开

在应用关闭时单击 Firebase 通知后打开特定的活动/片段