Android 根据消息推送内容跳转至指定页面(极光推送)

首先认识一下安卓newIntent方法的使用:

newIntent方法的使用在于如果activity已经开启了,并设置了启动模式为:  android:launchMode="singleTask"的时候,当再次使用intent来启动这个activtiy的时候就会进入这个方法里面onNewIntent(Intent intent) ,当在接受通知栏的函数里面,就可以传递参数,在该activity的onnewIntent进行判断处理,如果Activity被关闭了,将会重新调用onCreate方法,所以安全起见,在onCreate中也需要加入判断指定需要显示的界面,如下图:

 关于onnewintent的部分解释如下:



然后需要自定义一个广播接收器用于接收通知栏信息

<!-- User defined. 用户自定义的广播接收器 -->
<receiver
    android:name=".notificationbar.MessageReceiver"
    android:enabled="true">
    <intent-filter>
        <!-- Required 用户注册SDK的intent -->
        <action android:name="cn.jpush.android.intent.REGISTRATION" />
        <!-- Required 用户接收SDK消息的intent -->
        <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
        <!-- Required 用户接收SDK通知栏信息的intent -->
        <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
        <!-- Required 用户打开自定义通知栏的intent -->
        <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
        <!-- 接收网络变化 连接/断开 since 1.6.3 -->
        <action android:name="cn.jpush.android.intent.CONNECTION" />

        <category android:name="hz.resfine.helpme_repair" />
    </intent-filter>
</receiver>
/**
 * 自定义广播接收器 以极光推送为例子
 * Created by zhengxt on 2017-03-17.
 */
public class MessageReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        //网络状态监听
        //如果无网络连接activeInfo为null
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mobileInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        NetworkInfo wifiInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        NetworkInfo activeInfo = manager.getActiveNetworkInfo();
        if(activeInfo != null){
//            Toast.makeText(context, "mobile:" + mobileInfo.isConnected() + "\n"
//                    + "wifi:" + wifiInfo.isConnected() + "\n"
//                    + "active:" + activeInfo.getTypeName(), Toast.LENGTH_SHORT).show();
            MainActivity.mainActivity_instance.getHomeData();  //获取首页数据
            //有网络连接的时候开启定位
            if(Constants.mapServiceState == 2){
//                MainActivity.mainActivity_instance.mLocationClient.startLocation();
                MainActivity.mainActivity_instance.honeDismissMyDialog();
            }
        }
//      通知栏点击事件监听
//      通知栏收到消息时触发
        NotificationBarEvent notificationBarEvent = new NotificationBarEvent();

        /**
         * 极光推送
         */
        if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
//            Logger.d(TAG, "JPush用户注册成功");

        } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
//            Logger.d(TAG, "接受到推送下来的自定义消息");

        } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
//            Logger.d(TAG, "接受到推送下来的通知");在通知到达时触发
            notificationBarEvent.receivingNotification(context,bundle.getString(JPushInterface.EXTRA_ALERT));

        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
//            Logger.d(TAG, "用户点击打开了通知");当用户点击时触发
            notificationBarEvent.openNotification(context,bundle.getString(JPushInterface.EXTRA_ALERT));
        }
    }


}
其中  NotificationBarEvent 是自定义封装的事件处理类,将通知栏的通知信息数据传递到该类中,在类里面做具体的处理
/**
 * 通知栏点击事件监听
 * 通知栏收到消息时触发
 * Created by zhengxt on 2017-08-01.
 */
public class NotificationBarEvent {

    //接受推送下来的通知,消息到达时触发
    public void receivingNotification(Context context, String message1) {
        String message = message1; //获取等到通知栏消息

        MainActivity.mainActivity_instance.GetStoreUnreadMessages(); //获取商家未读消息
           
    }
  //通知栏点击监听事件,用户点击时触发
    public void openNotification(Context context, String description) {

        String alert = description;

        //根据消息内容跳转到指定页面
        Intent i = new Intent(context, MainActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        i.putExtra("message1", Constants.MY_BUSINESS1);
        i.putExtra("businessindex", "2");
        context.startActivity(i);
    }
}

    MainActivity中onNewIntent方法,在该方法中接收自定义广播接收器传过来的参数并做相应的操作,同时为了防止activity被销毁,在onCreate中也应做相应操作。

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        messageType = intent.getIntExtra("message1", 0);
        myOrderIndex = intent.getStringExtra("orderindex");
        myBusinessIndex = intent.getStringExtra("businessindex");

        if (messageType == Constants.MY_ORDER1) {
            setTabSelection(1);
        } else if (messageType == Constants.MY_BUSINESS1) {
            setTabSelection(2);
        }
    }



扫描二维码关注公众号,回复: 1708258 查看本文章

 扩展知识:

Android中Activity启动模式详解 

  在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。 

  Android总Activity的启动模式分为四种: 

Java代码   收藏代码
  1. Activity启动模式设置:  
  2.   
  3.         <activity android:name=".MainActivity" android:launchMode="standard" />  
  4.   
  5. Activity的四种启动模式:  
  6.   
  7.     1. standard  
  8.   
  9.         默认启动模式,每次激活Activity时都会创建Activity,并放入任务栈中,永远不会调用onNewIntent()。  
  10.   
  11.     2. singleTop  
  12.   
  13.         如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,并调用其onNewIntent(),否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例,而不会调用onNewIntent(),此时就跟standard模式一样)。  
  14.   
  15.     3. singleTask  
  16.   
  17.         如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中(此时不会调用onNewIntent())。   
  18.   
  19.     4. singleInstance  
  20.   
  21.         在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。  


最后附上类似的博客地址:http://blog.csdn.net/nihaoqiulinhe/article/details/50697301





猜你喜欢

转载自blog.csdn.net/zxt94/article/details/65935121