美文网首页
面试总结(2017.7.4)

面试总结(2017.7.4)

作者: vip昨夜星辰昨夜风 | 来源:发表于2017-07-05 19:13 被阅读16次

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

    初步的思路是先判断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)

          本文链接:https://www.haomeiwen.com/subject/ugnqhxtx.html