2015-08-11 2 views
3

Теперь я знаю, что на это много вопросов, но мне не удалась вообще и подумал задать здесь вопрос.Нажатие на уведомление от OneSignal не открывает активность результата !!!! - Android

У меня есть приложение, которое просто запускает splashscreen, за которым следует MainActivity (который является только WebView). Теперь я интегрировал это с OneSignal для получения push-уведомлений.

Все работает хорошо, я имею в виду, что я получаю уведомление при отправке через веб-сайт oneignal на свой телефон, но я сталкиваюсь с тем, что нажатие на уведомление не получает мою ResultActivity (просто активность, отображающая сообщение Toast) ,

Мои фрагменты кода выглядит следующим образом:

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); 
      } 
    } 

Manifest:

<?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

Болезненно изменять одну линию и тестировать ее на устройстве! Поскольку oneignal позволяет тестировать только на устройстве. Пожалуйста, помогите или, по крайней мере, ведите меня, как отлаживать.

Устройство, на котором протестирован apk: Samsung Galaxy S4 работает Lolipop.

ответ

3

OneSignal.init должно быть вызвано из вашей операции запуска, вам нужно будет перенести его на ваш splashscreen вид деятельности. Это приведет к срабатыванию вашего ExampleNotificationOpenedHandler при открытии уведомления OneSignal.

Обязательно также скопируйте вызовы в OneSignal.onPaused(); и OneSignal.onResumed(); в свой заставку. Они должны быть вызваны в каждой Деятельности в методах onPuase() и onResume().

+0

Спасибо за ответ. Пробовал, но не работал. На этот раз уведомление не получено !! Перемещенный код инициализации находится здесь - http://clipboard.space/clip/0jXkLrR1nOc3kOQGgDzz Пожалуйста, помогите! –

+0

Ваш AlertBuilder должен появиться в вашем классе notificationReceived, а не в вашем классе notificationOpened. Затем переопределите класс notificationOpened, чтобы открыть любую деятельность по вашему выбору (она открывает MainActivity по умолчанию, вы должны были понять) – Gordons

4

Посмотрите на эту ссылку: https://documentation.onesignal.com/docs/android-customizations#section-background-data-and-notification-overriding (Search: «Изменение открытого действия уведомления» на странице, чтобы перейти к точному пункту).

И это пример: http://androidbash.com/android-push-notification-service-using-onesignal/

У меня нет времени, чтобы прочитать внимательно код, но кажется, что это имеет некоторые проблемы:

  1. инициализации OneSignal в неправильном месте ,

    «Убедитесь, что вы инициализацией OneSignal с setNotificationOpenedHandler в OnCreate метод в вашей Application класса. Вам нужно будет позвонить startActivity из этого обратного вызова» (документ OneSignal в).

  2. Вам не нужны любых других приемников в AndroidManifest поймать намерение и открыть свою целевую деятельность, OneSignal.NotificationOpenedHandler уже с этим справиться. Но не стоит забывать эту линию, чтобы предотвратить OneSignal открыть пусковую деятельность:

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

Я использую это решение в мое приложение и оно работает отлично. Потому что так оно и есть.

Смежные вопросы