Android切换前后台点击通知进入当前页面
在上一节讲述了,本人使用的怎么判断App退到后台的两种方式,这里主要讲述当App退出到后台的后,怎么点击通知回到原来按下HOME键之前的前台页面.
首先,先展示效果,有图才有真相

效果如上图,当我们按下back键或者HOME键的时候.程序退到后台,弹出通知,点开通知回到当前页面. 在上节中,我有讲述到判断程序退到后台的两种方式. 第一种方式:在BaseActivity中onPause方法中判断程序退出后台之后,进入广播页面:
public class BaseActivity extends AppCompatActivity {
private static final String TAG = "BaseActivity";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppManager.getInstance().addActivity(this);
}
@Override
protected void onPause() {
super.onPause();
if(!isAppOnForeground()){
Toast.makeText(getApplicationContext(), TAG+"onPause:",
Toast.LENGTH_SHORT).show();
}else {
Log.e(TAG, "onPause: "+"弹出通知");
//第一种方式退到后台
Intent _intent = new Intent(DemoBroadcastReceiver.ACTION_NOTIFY_MESSAGE);
_intent.setClass(getApplicationContext(), DemoBroadcastReceiver.class);
sendBroadcast(_intent);
}
}第二种方式,在Application中中onStopActivity方法中判断程序退出后台之后,进入广播页面:
@Override
public void onActivityStopped(Activity activity) {
countActivity--;
L.i("onActivityStopped", "countActivity=" + countActivity);
if (countActivity <= 0) {
if (WDRTCSysConfig.getInstance().isCalling()) {
Intent _intent = new Intent(WDBroadcastReceiver.ACTION_ENABLE_MESSAGES);
_intent.setClass(getApplicationContext(), WDBroadcastReceiver.class);
sendBroadcast(_intent);
}
}
}不管是方法一或者 方法 二:都是进入广播服务中,进行判断然后弹出Notification通知出来.主要代码如下:
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
case ACTION_NOTIFY_MESSAGE:
String name = null;
String avatar = null;
//方法一:从系统的Stack中拿到当前的Activity
/* ActivityManager mActivityManager = ((ActivityManager) context.getApplicationContext()
.getSystemService(Context.ACTIVITY_SERVICE));
List<ActivityManager.RunningTaskInfo> taskInfos = mActivityManager.getRunningTasks(1);
Class<?> _class = taskInfos.get(0).topActivity.getClass();
*/
//方法二:从AppManger的Stack中拿到当前的Activity
Class<?> _class = AppManager.getInstance().currentActivity().getClass();
if (_class != null) {
if (null != reflectionActivity()) {
//拿到反射的数据
Bundle _bundle = reflectionActivity();
if (_bundle != null) {
name = _bundle.getString("name");
avatar = _bundle.getString("avatar");
}
}
NotificationUtils _notifyUtils = NotificationUtils.getInstance();
_notifyUtils.init(context.getApplicationContext(), _class);
_notifyUtils.showNotification("从" + name + "退出到后台");
}
break;
}
}注意上面代码:有两种方式拿到当前的Activity. 这两个这里先简单介绍,后面详细解释 稍微注意下第21行:这里主要通过反射拿到当前Activity要传给通知栏显示的信息,; 而通知栏的主要代码如下:没什么好解释的
public void showNotification(@NonNull String contentText){
PendingIntent _pendingIntent = PendingIntent.getActivity(mContext, notifId, mNotificationIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
builder.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(),R.mipmap.ic_launcher))
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("通知测试")
.setContentText(contentText)
.setSubText(mContext.getString(R.string.notice_click_into))
.setPriority(Notification.PRIORITY_HIGH)
.setVibrate(new long[]{0, 0, 0, 10})
//.setFullScreenIntent(_pendingIntent, true)
.setContentIntent(_pendingIntent);
//在什么状态下显示通知,比如锁屏状态
if (Build.VERSION.SDK_INT >= 21) {
builder.setVisibility(Notification.VISIBILITY_PUBLIC);
builder.setCategory(Notification.CATEGORY_MESSAGE);
}
mNotification = builder.build();
mNotificationManager.notify(notifId, mNotification);
}关于怎样获取当前的Activity,这里是主要的关键,这里我使用了两种方法: 方法二: 我自己手动建立了一个Activity的Stack的工具栏,然后对Activity进行增删操作处理,主要代码如下:
public class AppManager {
private static AppManager instance;
private static Stack<Activity> activityStack;
public static AppManager getInstance() {
if (instance == null) {
//懒汉双层锁,保证线程安全
synchronized (AppManager.class) {
if (instance == null) {
instance = new AppManager();
}
}
}
return instance;
}
/**
* 添加Activity到stack中
*/
public void addActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<>();
}
if (activityStack.contains(activity)) {
activityStack.remove(activity);
}
activityStack.add(activity);
}
/**
* 获取stack中当前的Activity
*/
public Activity currentActivity() {
if (null != activityStack && null != activityStack.lastElement()) {
return activityStack.lastElement();
}
return null;
}
/**
* 移除当前的Activity
*/
public void finishActivity() {
if (null != activityStack && null != activityStack.lastElement()) {
finishActivity(activityStack.lastElement());
}
}
}这是一个单例,然后在BaseActivity的onCreate中调用Add方法,在Activity要finish的时候,调用这里的finishActivity方法,而CurrentActivity就是我们需要的当前的Activity;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppManager.getInstance().addActivity(this);
}另外还有一种方式就是获取当前Activity的方法,就是程序系统本身就有一个Stack的,我们可以通过管理 ActivityManager. getRunningTasks(1) 来拿到当前的Activity,这是我在网上看到的.
ActivityManager mActivityManager = ((ActivityManager) _app
.getSystemService(Context.ACTIVITY_SERVICE));
List<RunningTaskInfo> taskInfos = mActivityManager.getRunningTasks(1);
Class<?> intentActivity = taskInfos.get(0).topActivity.getClass();但是由于 mActivityManager . getRunningTasks ( 1 ) 在 API21以后是过期的,而且需要一个task的配置权限.本人没有使用它,来进行处理.好了,大致的程序就是这些,具体的可以下载demo; 点击这里:Demo下载
到此这篇关于Android切换前后台点击通知进入当前页面的文章就介绍到这了,更多相关android切换前后台内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
android开发之蜂鸣提示音和震动提示的实现原理与参考代码
蜂鸣提示音和震动提示此功能在手机使用中很实用,最近在读zxing项目,学到了不少东西;我们一起来看看他是怎么做的,感兴趣的朋友可以了解下哦2013-01-01
Android的OkHttp包中的HTTP拦截器Interceptor用法示例
拦截器是OkHttp处理HTTP请求方面所具有的一个强大特性,这里我们就来看一下Android的OkHttp包中的HTTP拦截器Interceptor用法示例,需要的朋友可以参考下2016-07-07
Android 异步获取网络图片并处理导致内存溢出问题解决方法
Android异步获取网络图片并处理图片Out Of Memory内存溢出如何解决呢?本文介绍了操作步骤,感兴趣的朋友可以了解下或许对你有所帮助2013-02-02
Android布局(RelativeLayout、TableLayout等)使用方法
这篇文章主要介绍了Android布局使用方法及各种属性介绍,包括RelativeLayout、TableLayout等,感兴趣的朋友可以参考一下2016-03-03
Android GridView扩展仿微信微博发图动态添加删除图片功能
这篇文章主要为大家详细介绍了Android GridView扩展仿微信微博发图动态添加删除图片功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-05-05


最新评论