首先认识一下安卓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
版权声明:本文为博主原创文章,转载请附上博文链接!