如何在应用程序而不是浏览器中打开通知
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。
这是最好的方法。
我正在使用 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。 这是最好的方法。