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

 扩展知识:

Activity的四种启动模式和onNewIntent()
Android中Activity启动模式详解 

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

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

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


--------------------- 
作者:登岗小生 
来源:CSDN 
原文:https://blog.csdn.net/zxt94/article/details/65935121 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用uni-app的插件来实现与极光推送的对接和页面跳转。首先,你需要安装uni-app的极光推送插件,可以通过以下命令进行安装: ``` npm install uni-push-js-plugin ``` 然后,在你的uni-app项目中创建一个名为`jpush.js`的文件,用于初始化和配置极光推送。在该文件中,你可以使用如下代码进行初始化: ```javascript import JPush from 'jpush-uniapp' // 初始化极光推送 JPush.init() // 设置点击通知跳转指定页面 JPush.openNotificationToPage((res) => { // 在这里处理跳转逻辑 }) ``` 在以上代码中,`JPush.init()`用于初始化极光推送插件,而`JPush.openNotificationToPage()`则用于设置点击通知后跳转指定页面的回调函数。 接下来,你可以在需要接收和处理极光推送页面中引入`jpush.js`文件,并在合适的时机调用相关方法。例如,在uni-app的`App.vue`或者某个页面的`mounted`生命周期函数中,你可以调用以下代码来监听极光推送的通知: ```javascript import '@/path/to/jpush.js' export default { mounted() { // 监听极光推送通知 JPush.receiveNotification((res) => { // 在这里处理接收到的通知 }) } } ``` 在以上代码中,`JPush.receiveNotification()`用于监听极光推送的通知,你可以在回调函数中处理接收到的通知信息。 至此,你已经完成了uni-app与极光推送的对接。当收到极光推送的通知时,你可以在相应的回调函数中编写代码来实现页面跳转逻辑。具体的跳转方式可以根据你的需求来进行定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值