从OneSignal点击通知不会打开结果活动! - Android

时间:2015-08-11 15:56:38

标签: notifications onesignal

现在我知道这方面有很多问题,但我一点都没有运气,并且想在这里问一个问题。

我有一个应用程序只运行一个启动画面,然后是一个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。

2 个答案:

答案 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/

我没有时间仔细阅读您的代码,但似乎有一些问题:

  1. 您在错误的位置初始化OneSignal。

    &#34;确保使用初始化OneSignal 你的onCreate方法中的setNotificationOpenedHandler 申请类。你需要从这个回调调用startActivity&#34; (OneSignal的文件)。

  2. 您不需要 AndroidManifest 中的任何其他接收器来捕获意图并打开您的目标活动 OneSignal.NotificationOpenedHandler 已经处理好了。但请不要忘记这一行,以防止OneSignal打开您的启动器活动:

  3. <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()方法的每个活动中调用。