1、back键切换后台的实现:
这个实现需要在主activity重写onbackpressed()方法。代码如下:
实现原理其实很简单,本来系统按back键的话是会destroy activity的,在这里,我们重写,改为使用intent启动HOME桌面
public static final String CATEGORY_HOME: This is the home activity, that is the first activity that is displayed when the device boots. Constant Value: "android.intent.category.HOME"
谷歌的官方文档写的很清楚,这会启动home activity,也就是手机的桌面程序。这样,我们应用的主activity不会destroy,而只是stop。实现了按home键相同的效果。
2、点击通知栏恢复前台:
在我们收到消息时,会在通知栏显示消息,并且点击通知栏消息后,程序可以切换到前台。下面是程序的结构:
程序结构如上图所示:MainActivity为主Activity,类似于微信,QQ的主界面;ShowPushActivity显示消息内容,类似于微信,QQ的聊天activity;MyApplication继承Application,实现通知栏的显示等操作;BringToFrontReceiver接受通知栏广播,将程序切换至前台。
上述代码实现应用启动后通知栏的显示,用户点击后发送广播到BringToFrontReceiver。模拟收到push消息。 如果我们只是单纯的实现此时将程序切换到前台,我自己想出如下两种实现方式:
1、利用activitymanager的 moveTaskToFront 方法:
下面是接受到广播后的代码:
原理就是首先获取当前应用的task,然后利用moveTaskToFront,将该task切换到前台。若是没有活动的task,则重新启动程序。
但是moveTaskToFront只支持到3.0,那么3.0一下怎么实现呢,看方法2
2、自己利用startactivity实现:
下面是接受到广播后的代码:
权限
首先获取当前应用的task,然后获得task的栈顶activity,也就是最后打开的activity的名称,然后启动它,既可以切换到前台了。核心是这句话:resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
因为是singletop,所以activity不会重新创建,而是调用onnewintent方法。若是没有活动的task,则重新启动程序。这种方法不存在版本兼容问题,需要的权限还要少一个。
然而当我们观察微信,QQ的话,其点击通知栏不仅仅是将程序切换到前台,而且还会打开消息的对话activity。这个实现其实比只是切换到前台简单多了:
接收到广播后的处理:
假设我们这里的ShowPushActivity为聊天的activity,那么只需要启动这个activity,并且加上flag:resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);就可以实现目的了。
这样ShowPushActivity会在后台的task启动,并且会将task带入前台。如果已经有一个ShowPushActivity,不会重新创建,而是调用onnewintent启动activity。
通过上面的介绍我们实现了类似微信,QQ的前后台切换:back键切换后台;点击通知栏恢复前台。其中恢复前台提供了两种方法,是我自己看官方文档,得到的启发,得到了实现。我觉得只要自己肯于静下心来研究Android的官方文档很多问题都可以迎刃而解。
转自CSDN sddyljsx的博客。
这个实现需要在主activity重写onbackpressed()方法。代码如下:
@Override public void onBackPressed() { Intent intent= new Intent(Intent.ACTION_MAIN); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); }
实现原理其实很简单,本来系统按back键的话是会destroy activity的,在这里,我们重写,改为使用intent启动HOME桌面
public static final String CATEGORY_HOME: This is the home activity, that is the first activity that is displayed when the device boots. Constant Value: "android.intent.category.HOME"
谷歌的官方文档写的很清楚,这会启动home activity,也就是手机的桌面程序。这样,我们应用的主activity不会destroy,而只是stop。实现了按home键相同的效果。
2、点击通知栏恢复前台:
在我们收到消息时,会在通知栏显示消息,并且点击通知栏消息后,程序可以切换到前台。下面是程序的结构:
程序结构如上图所示:MainActivity为主Activity,类似于微信,QQ的主界面;ShowPushActivity显示消息内容,类似于微信,QQ的聊天activity;MyApplication继承Application,实现通知栏的显示等操作;BringToFrontReceiver接受通知栏广播,将程序切换至前台。
/** * Created by neal on 2014/11/18. */ public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("QQ") .setContentText("您收到了一条新消息"); Intent intent=new Intent(BringToFrontReceiver.ACTION_BRING_TO_FRONT); mBuilder.setContentIntent(PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)); mBuilder.setAutoCancel(true); NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // mId allows you to update the notification later on. Notification notification=mBuilder.build(); mNotificationManager.notify(1, notification); } }
上述代码实现应用启动后通知栏的显示,用户点击后发送广播到BringToFrontReceiver。模拟收到push消息。 如果我们只是单纯的实现此时将程序切换到前台,我自己想出如下两种实现方式:
1、利用activitymanager的 moveTaskToFront 方法:
下面是接受到广播后的代码:
public class BringToFrontReceiver extends BroadcastReceiver { public static final String ACTION_BRING_TO_FRONT ="neal.pushtest.action.BringToFront"; public BringToFrontReceiver() { } @Override public void onReceive(Context context, Intent intent) { //获取ActivityManager ActivityManager mAm = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); //获得当前运行的task ListtaskList = mAm.getRunningTasks(100); for (ActivityManager.RunningTaskInfo rti : taskList) { //找到当前应用的task,并启动task的栈顶activity,达到程序切换到前台 if(rti.topActivity.getPackageName().equals(context.getPackageName())) { mAm.moveTaskToFront(rti.id,0); return; } } //若没有找到运行的task,用户结束了task或被系统释放,则重新启动mainactivity Intent resultIntent = new Intent(context, MainActivity.class); resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP); context.startActivity(resultIntent); } }
原理就是首先获取当前应用的task,然后利用moveTaskToFront,将该task切换到前台。若是没有活动的task,则重新启动程序。
但是moveTaskToFront只支持到3.0,那么3.0一下怎么实现呢,看方法2
2、自己利用startactivity实现:
下面是接受到广播后的代码:
public class BringToFrontReceiver extends BroadcastReceiver { public static final String ACTION_BRING_TO_FRONT ="neal.pushtest.action.BringToFront"; public BringToFrontReceiver() { } @Override public void onReceive(Context context, Intent intent) { //获取ActivityManager ActivityManager mAm = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); //获得当前运行的task ListtaskList = mAm.getRunningTasks(100); for (ActivityManager.RunningTaskInfo rti : taskList) { //找到当前应用的task,并启动task的栈顶activity,达到程序切换到前台 if(rti.topActivity.getPackageName().equals(context.getPackageName())) { try { Intent resultIntent = new Intent(context, Class.forName(rti.topActivity.getClassName())); resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); context.startActivity(resultIntent); }catch (ClassNotFoundException e) { e.printStackTrace(); } return; } } //若没有找到运行的task,用户结束了task或被系统释放,则重新启动mainactivity Intent resultIntent = new Intent(context, MainActivity.class); resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP); context.startActivity(resultIntent); } }
权限
首先获取当前应用的task,然后获得task的栈顶activity,也就是最后打开的activity的名称,然后启动它,既可以切换到前台了。核心是这句话:resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
因为是singletop,所以activity不会重新创建,而是调用onnewintent方法。若是没有活动的task,则重新启动程序。这种方法不存在版本兼容问题,需要的权限还要少一个。
然而当我们观察微信,QQ的话,其点击通知栏不仅仅是将程序切换到前台,而且还会打开消息的对话activity。这个实现其实比只是切换到前台简单多了:
接收到广播后的处理:
public class BringToFrontReceiver extends BroadcastReceiver { public static final String ACTION_BRING_TO_FRONT ="neal.pushtest.action.BringToFront"; public BringToFrontReceiver() { } @Override public void onReceive(Context context, Intent intent) { Intent resultIntent = new Intent(context, ShowPushActivity.class); resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP); context.startActivity(resultIntent); } }
假设我们这里的ShowPushActivity为聊天的activity,那么只需要启动这个activity,并且加上flag:resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);就可以实现目的了。
这样ShowPushActivity会在后台的task启动,并且会将task带入前台。如果已经有一个ShowPushActivity,不会重新创建,而是调用onnewintent启动activity。
通过上面的介绍我们实现了类似微信,QQ的前后台切换:back键切换后台;点击通知栏恢复前台。其中恢复前台提供了两种方法,是我自己看官方文档,得到的启发,得到了实现。我觉得只要自己肯于静下心来研究Android的官方文档很多问题都可以迎刃而解。
转自CSDN sddyljsx的博客。
收藏的用户(0) X
正在加载信息~
推荐阅读
x86 emulation currently requires hardware acceleration
最新回复 (0)
站点信息
- 文章2300
- 用户1336
- 访客10860229
每日一句
True success inspires others to act.
真正的成功是激励他人行动。
真正的成功是激励他人行动。
语法错误: 意外的令牌“标识符”
全面理解Gradle - 定义Task
Motrix全能下载工具 (支持 BT / 磁力链 / 百度网盘)
谷歌Pixel正在开始起飞?
获取ElementUI Table排序后的数据
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
亲测!虚拟机VirtualBox安装MAC OS 10.12图文教程
华为手机app闪退重启界面清空log日志问题
android ndk开发之asm/page.h: not found
手机屏幕碎了怎么备份操作?
免ROOT实现模拟点击任意位置
新手必看修改DSDT教程
thinkpad t470p装黑苹果系统10.13.2
新会员