4

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

我有一个应用程序,它只运行一个启动屏幕,然后是一个 MainActivity(这只是一个 WebView)现在我将它与 OneSignal 集成以接收推送通知。

一切正常,我的意思是当我通过 onesignal 网站发送到我的手机时收到通知 - 但我面临的事情是,点击通知不会获得我的 ResultActivity(只是一个显示 Toast 消息的活动)。

我的代码片段如下所示:

闪屏.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();
   }
} 

主.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());

  }
}
}

结果活动.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>

我已经尝试了所有这些答案,但都没有奏效:

通知未打开活动 onCLick

Android 状态栏通知 - 选择通知时打开正确的活动

Android:点击推送通知不打开应用程序

Android点击通知没有打开附加的Activity

修改一行并在设备上测试它是痛苦的!由于 onesignal 只允许在设备中进行测试。请帮助或至少指导我如何调试。

测试 apk 的设备:运行 Lolipop 的三星 Galaxy S4。

4

2 回答 2

10

看看这个链接: https ://documentation.onesignal.com/docs/android-customizations#section-background-data-and-notification-overriding (搜索:“更改通知的打开操作”在页面中转到确切的段落)。

这是一个例子: http ://androidbash.com/android-push-notification-service-using-onesignal/

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

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

    “确保您在 Application类的 onCreate 方法中使用 setNotificationOpenedHandler 初始化 OneSignal。您需要从此回调调用 startActivity”(OneSignal 的文档)。

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

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

我在我的应用程序中使用了这个解决方案,它工作正常。因为它就是这样。

于 2017-03-07T10:10:59.937 回答
3

OneSignal.init必须从您的启动器 Activity 调用,您需要将其移动到您的splashscreenActivity。ExampleNotificationOpenedHandler当您打开 OneSignal 通知时,这会让您触发。

确保还将调用复制到启动屏幕活动中OneSignal.onPaused();并复制到其中。OneSignal.onResumed();这些需要在每个Activity的onPuase()andonResume()方法中调用。

于 2015-08-11T19:07:27.223 回答