如何在应用程序而不是浏览器中打开通知

How to open notification in app not in browser

我正在使用 OneSignal 网站发出应用通知,当我单击在网络浏览器中而不是在应用中打开的通知时。但是我想打开应用程序上的所有通知。

注意:我的应用在 webview 上运行。

请帮我处理应用程序的通知。

我的主要 Activity 代码:

  import androidx.appcompat.app.AppCompatActivity;

    import android.content.Intent;
    import android.content.pm.ActivityInfo;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.Window;

    public class MainActivity extends AppCompatActivity {

        MyApplication myApplication;

        private static int SPLASH_TIME_OUT = 3000;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            setContentView(R.layout.activity_main);
            myApplication = MyApplication.getInstance();
            new Handler().postDelayed(new Runnable(){
                @Override
                public void run() {
                    Intent homeIntent = new Intent(MainActivity.this, HomeActivity.class);
                    startActivity(homeIntent);
                    finish();
                }
            },SPLASH_TIME_OUT);

        }

    }


My Application Code:

import android.app.Application;

import com.onesignal.OneSignal;

public class MyApplication extends Application {

    private static MyApplication mInstance;

    public MyApplication() {
        mInstance = this;
    }

    @Override
    public void onCreate() {

        super.onCreate();

        mInstance = this;

        // OneSignal Initialization
        OneSignal.startInit(this)
                .inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification)
                .unsubscribeWhenNotificationsAreDisabled(true)
                .init();

    }

    public static synchronized MyApplication getInstance() {
        return mInstance;
    }
}

我厌倦了这个信号库版本,但它运行良好

将其放入 build.gradle(app) 文件

//One Signal
implementation 'com.onesignal:OneSignal:[3.9.1, 3.99.99]'

现在像这样创建一个应用程序class

public class SampleApplication extends Application {

private static SampleApplication sInstance;
private static Context context;

public static SampleApplication getInstance() {
    return sInstance;
}

@Override
public void onCreate() {
    super.onCreate();
    sInstance = this;
    context = getApplicationContext();
    MultiDex.install(context);

    // OneSignal Initialization
    OneSignal.startInit(this)
            .setNotificationOpenedHandler(new MyNotificationOpenedHandler(this))
            .init();
}

public static SampleApplication getAppContext() {
    return (SampleApplication) context;
}}

现在清单文件中的这个 SampleApplication

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

这是我的通知处理程序class

public class MyNotificationOpenedHandler implements OneSignal.NotificationOpenedHandler, AppConstants {

private Application application;

public MyNotificationOpenedHandler(Application application) {
    this.application = application;
}

@Override
public void notificationOpened(OSNotificationOpenResult result) {
    String launchUrl = result.notification.payload.launchURL;
    if (TextUtils.isEmpty(launchUrl)) {
        startAppWithLaunchScreen();
    } else {
        startAppWithHomeScreen(launchUrl);
    }
}

private void startAppWithLaunchScreen() {
    Intent intent = new Intent(application, SplashScreenActivity.class).setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
    application.startActivity(intent);
}


private void startAppWithHomeScreen(String launchURL) {
    Intent intent = new Intent(application, WebViewActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra(ONE_SIGNAL_LAUNCH_URL, launchURL);
    application.startActivity(intent);
}}

据我了解,您想直接在应用程序中处理一个信号通知。

这是我很久以前用来执行相同操作的代码:

try {
      OneSignal.startInit(this)
          .inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification)
          .setNotificationOpenedHandler(new MyNotificationOpenedHandler()) //Handle notification Opened
          .setNotificationReceivedHandler(new MyNotificationReceivedHandler())
          .init();
      NotificationUtils
          .sendTag(MyNotificationOpenedHandler.APP_VERSION, BuildConfig.VERSION_NAME);
      OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() {
        @Override
        public void idsAvailable(String userId, String registrationId) {
          notificationId = userId;
          Log.v("notificationId", "notificationId is " + notificationId);
          OneSignal.setSubscription(pref.getDataBoolean(PREF_IS_NOTIFICATIONS_ENABLED, true));
        }
      });
    } catch (Exception e) {
      e.printStackTrace();
      Crashlytics.logException(e);
    }

MyNotificationOpenedHandler implements OneSignal.NotificationOpenedHandler 重写下面的方法 public void notificationOpened(OSNotificationOpenResult result) {} 当用户点击您可以编写逻辑的通知时将调用该方法。

这是示例逻辑:

@Override

  public void notificationOpened(OSNotificationOpenResult result) {
    try {

      //To launch homepage if in case of no launchUrl. - IOS Limitation - cannot support http from panel.
      if (result.notification.payload.launchURL == null) {
        result.notification.payload.launchURL = "";
      }

      if (result.notification.payload.launchURL != null) {
        if (result.notification.payload.launchURL.startsWith("market://")) {
          String marketUrl = result.notification.payload.launchURL;
          AndroidUtils.openMarketLinkPage(context, marketUrl);
        } else {

          //Failsafe. Supports both http:// and without it.
          result.notification.payload.launchURL =
              "http://" + DeepLinkUtils.stripUrlSchema(result.notification.payload.launchURL);

          if (result.notification.isAppInFocus) {
            Intent mainIntent = NavigationUtilsKt.getHomeIntent(AppController.getInstance());
            mainIntent.putExtra(AppConstants.EXTRA_DEEPLINK_DATA, DeepLinkUtils
                .packDeepLinkData(NotificationUtils.NOTIFICATION,
                    Uri.parse(result.notification.payload.launchURL),
                    result.notification.androidNotificationId));
            mainIntent
                .setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
            AppController.getInstance().startActivity(mainIntent);
          } else {
            Intent mainIntent = new Intent(AppController.getInstance().getApplicationContext(),
                SplashActivity.class);
            mainIntent
                .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            mainIntent.putExtras(NotificationUtils.prepareNotificationBundle(result.notification.androidNotificationId));
            mainIntent.setData(Uri.parse(result.notification.payload.launchURL));
            AppController.getInstance().startActivity(mainIntent);

          }
        }
      }
      if (result.notification.payload.additionalData != null) {
        JSONObject campaignData = result.notification.payload.additionalData;
        if (campaignData.has(CAMPAIGN_URI)) {
          GtmUtils.gtmPushNotificationClick(GTM_SCREEN_NAME_NOTIFICATION,
              campaignData.getString(CAMPAIGN_URI),
              campaignData.has(CAMPAIGN_EVENTS) ? campaignData.getString(CAMPAIGN_EVENTS) : null);
        }
      }

    } catch (JSONException e) {
      e.printStackTrace();
    }

  }

希望对您有所帮助,如果您有任何问题,请告诉我。

我尝试在我的应用程序中添加深度 link,它成功了。 Deep links 适用于通知以及所有类型的 links。 这是最好的方法。