现在我知道这方面有很多问题,但我一点都没有运气,并且想在这里问一个问题。
我有一个应用程序只运行一个启动画面,然后是一个MainActivity(这只是一个WebView) 现在我将其与OneSignal集成以接收推送通知。
一切都很好,我的意思是当通过onesignal网站发送到我的手机时收到通知 - 但我面对的是,点击通知不会得到我的ResultActivity(只是一个显示Toast of message的活动)。
我的代码段如下所示:
splashscreen.java:
public class splashscreen extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
Thread splashThread = new Thread() {
@Override
public void run() {
try {
int waited = 0;
while (waited < 5000) {
sleep(100);
waited += 100;
}
} catch (InterruptedException e) {
// do nothing
} finally {
finish();
Intent i = new Intent();
i.setClassName("com.google",
"com.google.Main");
startActivity(i);
}
}
};
splashThread.start();
}
@Override
protected void onPause() {
super.onPause();
OneSignal.onPaused();
}
@Override
protected void onResume() {
super.onResume();
OneSignal.onResumed();
}
}
Main.java:
@SuppressLint("SetJavaScriptEnabled") public class Main extends Activity {
/** Called when the activity is first created. */
WebView web;
private static Activity currentActivity;
Intent resultIntent = new Intent(this, ResultActivity.class);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
currentActivity = this;
web = (WebView) findViewById(R.id.my_webview);
web.setWebViewClient(new myWebClient());
web.getSettings().setJavaScriptEnabled(true);
web.loadUrl("http://google.com");
OneSignal.init(this, "xxxxxxx", "xxx-xxx-xxxx-xxxx-xxxxxx", new ExampleNotificationOpenedHandler());
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.exit:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public class myWebClient extends WebViewClient
{
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
}
public boolean shouldOverrideUrlLoading(WebView view, String url) {
String url2="http://google.com";
// all links with in ur site will be open inside the webview
//links that start with your domain example(http://www.example.com/)
if (url != null && url.startsWith(url2)){
return false;
}
// all links that points outside the site will be open in a normal android browser
else {
view.getContext().startActivity(
new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
}
}
}
// To handle "Back" key press event for WebView to go back to previous screen.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {
web.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
protected void onPause() {
super.onPause();
OneSignal.onPaused();
}
@Override
protected void onResume() {
super.onResume();
OneSignal.onResumed();
}
// NotificationOpenedHandler is implemented in its own class instead of adding implements to MainActivity so we don't hold on to a reference of our first activity if it gets recreated.
private class ExampleNotificationOpenedHandler implements NotificationOpenedHandler {
/**
* Callback to implement in your app to handle when a notification is opened from the Android status bar or
* a new one comes in while the app is running.
* This method is located in this activity as an example, you may have any class you wish implement NotificationOpenedHandler and define this method.
*
* @param message The message string the user seen/should see in the Android status bar.
* @param additionalData The additionalData key value pair section you entered in on onesignal.com.
* @param isActive Was the app in the foreground when the notification was received.
*/
@Override
public void notificationOpened(String message, JSONObject additionalData, boolean isActive) {
String messageTitle = "OneSignal Example" + isActive, messageBody = message;
try {
if (additionalData != null) {
if (additionalData.has("title"))
messageTitle = additionalData.getString("title");
if (additionalData.has("actionSelected"))
messageBody += "\nPressed ButtonID: " + additionalData.getString("actionSelected");
messageBody = message + "\n\nFull additionalData:\n" + additionalData.toString();
}
} catch (JSONException e) { }
/*
new AlertDialog.Builder(Main.currentActivity)
.setTitle(messageTitle)
.setMessage(messageBody)
.setCancelable(true)
.setPositiveButton("OK", null)
.create().show();
*/
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(Main.currentActivity)
.setSmallIcon(R.drawable.cc)
.setContentTitle(messageTitle)
.setDefaults(
Notification.DEFAULT_SOUND
| Notification.DEFAULT_VIBRATE
| Notification.FLAG_AUTO_CANCEL)
.setContentText(messageBody);
resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent resultPendingIntent =
PendingIntent.getActivity(
Main.currentActivity,
0,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT
| PendingIntent.FLAG_ONE_SHOT
);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotifyMgr =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNotifyMgr.notify(001, mBuilder.build());
}
}
}
ResultActivity.java:
public class ResultActivity extends Activity {
/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
/*
ImageView image = new ImageView(this);
image.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher));
setContentView(image);
Toast.makeText(getApplicationContext(),
"Do Something NOW",
Toast.LENGTH_LONG).show();
*/
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
}
}
清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.google"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.google.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.google.permission.C2D_MESSAGE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity android:name="com.onesignal.NotificationOpenedActivity" android:theme="@android:style/Theme.NoDisplay">
</activity>
<receiver
android:name="com.onesignal.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.google" />
</intent-filter>
</receiver>
<service android:name="com.onesignal.GcmIntentService" />
<activity android:name=".splashscreen" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Main" android:label="@string/app_name" >
</activity>
<activity android:name=".ResultActivity"
android:label="@string/app_name"
android:exported="true">
</activity>
<receiver
android:name="com.google.OneSignalBackgroundDataReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.onesignal.BackgroundBroadcast.RECEIVE" />
</intent-filter>
</receiver>
</application>
</manifest>
我已经尝试了所有这些答案但没有奏效:
Notification Not open Acivity onCLick
Android Status Bar Notifications - Opening the correct activity when selecting a notification
Android :Tap on Push Notification does not open Application
Android click on notification does not open the attached Activity
修改一行并在设备上测试它是痛苦的!由于onesignal只允许在设备中进行测试。请帮助或至少指导我如何调试。
测试apk的设备:运行Lolipop的三星Galaxy S4。
答案 0 :(得分:9)
看一下这个链接: https://documentation.onesignal.com/docs/android-customizations#section-background-data-and-notification-overriding (搜索:&#34; 更改通知的打开操作&#34;在页面中转到确切的段落。)
这是一个例子: http://androidbash.com/android-push-notification-service-using-onesignal/
我没有时间仔细阅读您的代码,但似乎有一些问题:
您在错误的位置初始化OneSignal。
&#34;确保使用初始化OneSignal 你的onCreate方法中的setNotificationOpenedHandler 申请类。你需要从这个回调调用startActivity&#34; (OneSignal的文件)。
您不需要 AndroidManifest 中的任何其他接收器来捕获意图并打开您的目标活动 OneSignal.NotificationOpenedHandler 已经处理好了。但请不要忘记这一行,以防止OneSignal打开您的启动器活动:
<application ...>
<meta-data android:name="com.onesignal.NotificationOpened.DEFAULT" android:value="DISABLE" />
</application>
我在我的应用程序中使用此解决方案,它工作正常。因为它的方式就是这样。
答案 1 :(得分:3)
OneSignal.init
,您需要将其移至splashscreen
活动。这会在您打开OneSignal通知时触发ExampleNotificationOpenedHandler
。
确保同时将对OneSignal.onPaused();
和OneSignal.onResumed();
的通话复制到启动画面活动中。这些需要在onPuase()
和onResume()
方法的每个活动中调用。