当应用程序不是 运行 时打开特定的 Activity

Open a specific Activity when app is not running

我需要了解如何在点击来自 onesignal 的通知时打开特定的 activity。 下面我给出了到目前为止我尝试过的代码。 问题是这仅适用于 运行 应用程序。我需要打开那个 class 而不是 运行 应用程序。

private class ExampleNotificationOpenedHandler implements OneSignal.NotificationOpenedHandler {
        @Override
        public void notificationOpened(String message, JSONObject additionalData, boolean isActive) {
            try {          
                Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show();
            } catch (Throwable t)

            {
                t.printStackTrace();
            }
      Intent intent = new Intent(getApplication(), MyActivity.class);
      intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
      startActivity(intent);
        }
    }



private void registerWithOneSignal(String tag) {
        OneSignal.startInit(getContext())
                .setAutoPromptLocation(true)
                .setNotificationOpenedHandler(new ExampleNotificationOpenedHandler())
                .init();

        OneSignal.sendTag("TAG", tag);
        OneSignal.idsAvailable(ApplicationSettings.getInstance());
        OneSignal.enableVibrate(true);
        OneSignal.enableSound(true);
        OneSignal.setSubscription(true);
        OneSignal.enableNotificationsWhenActive(true);
        OneSignal.enableInAppAlertNotification(true);
    }

并且也在 Manifest 文件中

<meta-data android:name="com.onesignal.NotificationOpened.DEFAULT" android:value="DISABLE" />

首先判断你的应用是否在后台运行。

用这个方法判断

     /**
     * Method checks if the app is in background or not
     */
    public static boolean isAppIsInBackground(Context context) {
        boolean isInBackground = true;
     try {

            ActivityManager am = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE);
            ActivityManager.RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0);
            String foregroundTaskPackageName = foregroundTaskInfo .topActivity.getPackageName();
            PackageManager pm = context.getPackageManager();
            PackageInfo foregroundAppPackageInfo = pm.getPackageInfo(foregroundTaskPackageName, 0);
            String foregroundTaskAppName = foregroundAppPackageInfo.applicationInfo.loadLabel(pm).toString();
            if(!AppUtil.getStringResource(context,R.string.app_name).equalsIgnoreCase(foregroundTaskAppName) ){
                isInBackground=false;
            }
        } catch (PackageManager.NameNotFoundException e) {
            isInBackground=false;

        }
        return isInBackground;
    }

基于这个值使用这个逻辑

    Intent resultIntent = new Intent(getApplicationContext(), GCMNotificationActivity.class);//Activity to show once clicked on Notification
    resultIntent.putExtra(Constants.PUSH_MESSAGE, message);
    resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

    //assign result intent to pending intent
    PendingIntent resultPendingIntent =PendingIntent.getActivity(getApplicationContext(),0,resultIntent,PendingIntent.FLAG_CANCEL_CURRENT);
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext());

    //set Inbox style
    NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
    inboxStyle.addLine("message");//set message
    Notification notification = mBuilder.setSmallIcon(icon).setTicker(title).setWhen(0)
                        .setAutoCancel(true)
                        .setContentTitle("Title Message")
                        .setContentIntent(resultPendingIntent)
                        .setStyle(inboxStyle)
                        .setWhen(/* set current time here (long)*/)
                        .setSmallIcon(R.drawable.ic_noti_icon)
                        .setLargeIcon(BitmapFactory.decodeResource(getApplicationContext().getResources(), icon)) /* set icon */
                        .setContentText(message)
                        .build();

    NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(Constants.NOTIFICATION_ID, notification);