首先认识一下安卓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); } }
扩展知识:
Android中Activity启动模式详解
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。
Android总Activity的启动模式分为四种:
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。
Android总Activity的启动模式分为四种:
- 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都会进入同一个应用中。
最后附上类似的博客地址:http://blog.youkuaiyun.com/nihaoqiulinhe/article/details/50697301