面试总结(2017.7.4)

点击通知栏后的跳转(分两种情况)

初步的思路是先判断app进程是否存在,如果存在的话,就利用startActivities启动MainActivity和TargetActivity。为什么还要启动MainActivity而不直接只启动TargetActivity?因为有如下情况,进程中的所有Activity都已经退出了,但进程还没有被系统回收,这时判断进程是否存在返回true,然后只启动TargetActivity的话,按Back键任务栈就直接到底,返回桌面了。而我们要的效果是按Back键返回上一级Activity,也就是MainActivity。

如果app进程已经退出,不存在了,此时就用一个Intent启动应用,该Intent中包含一个Bundle, Bundle中存有启动TargetActivity所需的参数,这个Intent传入SplashActivity后,再由SplashActivity传给MainActivity,在MainActivity中加入判断,如果有该参数,则表示应用是从通知栏启动的,要进行跳转到TargetActivity的操作,否则就是常规启动。

代码如下

//判断app进程是否存活

if(SystemUtils.isAppAlive(context,"包名")){

//如果存活的话,就直接启动TargetActivity,但要考虑一种情况,就是app的进程虽然仍然在但Task栈已经空了,比如用户点击Back键退出应用,但进程还没有被系统回收,如果直接启动TargetActivity,再按Back键就不会返回MainActivity了。所以在启动//DetailActivity前,要先启动MainActivity。

  Intent mainIntent =new Intent(context, MainActivity.class);

//将MainAtivity的launchMode设置成SingleTask, 或者在下面flag中加上Intent.FLAG_CLEAR_TOP,如果Task栈中有MainActivity的实例,就会把它移到栈顶,把在它之上的Activity都清理出栈,如果Task栈不存在MainActivity实例,则在栈顶创建。

mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);       

Intent targetIntent =new Intent(context, TargetActivity.class);

targetIntent.putExtra("name","target"); 

Intent[] intents = {mainIntent, targetIntent};    

context.startActivities(intents);  

 }

else{

//如果app进程已经被杀死,先重新启动app,将TargetActivity的启动参数传入Intent中,参数经过SplashActivity传入MainActivity,此时app的初始化已经完成,在MainActivity中就可以根据传入参数跳转到TargetActivity中去了

Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage("包名");       launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK || Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);    

Bundle args =new Bundle();      

args.putString("name","launch");      

launchIntent.putExtra(Constants.EXTRA_BUNDLE, args);    

context.startActivity(launchIntent);

  }

你可能感兴趣的:(面试总结(2017.7.4))