我们经常有通过 Scheme 打开 App 的情况,并且大多数时候会通过 Scheme 携带一些参数回来。
一般情况下,可能都是正常的。但是!!!
当启动模式是 singTask 时,Activity 的生命周期就有了两种情况,可能会导致我们获取不到携带回来的参数。
那就新创建,那就是正常的流程
onCreate()
onStart()
onResume()
这个时候,我们获取 getIntent() 是没有问题的。
它在后台。这时候是 onPause() 或 onStop() 状态,在看启动流程
onNewIntent()
onRestart()
onStart()
onResume()
首先注意,onCreate() 方法不会再走了,如果是在 onCreate() 中获取 getIntent() 肯定是获取不到的。
然后来看这个 onNewIntent() 方法:
所以,我们再要获取到 intent ,就要重写 onNewIntent 方法,如下:
想要在 singleTask 模式下获取 getIntent() 有两种方式:
两者选其一即可。
Fragment中没有getIntent方法,需要通过Activity来。
可以这样实现:
Intent intent = getActivity()getIntent();
这样就可以在fragment中获取Activity的Intent
new Intent()构造函数接受两个参数,
第一个参数为Context上下文,可以为application(全局上下文)、自定义Context、或者当前Activity,一般多为当前activity
比如,从A页面活动跳转到B页面活动,代码如下(在A页面代码写入):
Intent intent=new Intent(Athis,BClass);startActivity(intent);
目标activity一般可以为activity、service等
上下文对象,指当前对象,比如你在MainActivity里写,那就是MainActivity对象
startActivity(new Intent(MainActivitythis,NextActivityclass));
我们一般写的比较简单的方法就是starActivity(new Intent(context,Aclass))这种启动的方式很简单,就是一个从当前界面跳转到下一个activity界面。
首先我们先要说一个问题,当你有d窗信息,或者通知栏里面出现了通知,然后你点击进去,不知道你有没有在意,APP会在五秒钟之后打开,当然,有的不会 大多数还是会的。现在我们就说一下这个问题
在谷歌的 Android API Guides 中,特意提醒开发者不要在后台启动 activity,包括在 Service 和 BroadcastReceiver 中,这样的设计是为了避免在用户毫不知情的情况下突然中断用户正在进行的工作
就是当通过 home 键将当前 activity 置于后台时,任何在后台startActivity 的 *** 作都将会延迟 5 秒,除非该应用获取了 "androidpermissionSTOP_APP_SWITCHES" 权限但是这个权限是系统级别的权限
解决方法:
不能够用传统的startActivity来启动Activity
Intent intent = new Intent(context, Aclass);
intentsetFlags(IntentFLAG_ACTIVITY_NEW_TASK);
contextstartActivity(intent);
而是要用以下形式来启动Activity:
Intent intent = new Intent(context, Aclass);
intentsetFlags(IntentFLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent =
PendingIntentgetActivity(context, 0, intent, 0);
try {
pendingIntentsend();
} catch (PendingIntentCanceledException e) {
eprintStackTrace();
}
OK,这种方式启动activity,一般是用在有后台任务的时候
starActivityforResult(),里面有两个参数,一个是intent,还有一个是requestcode,当你启动下一个界面的然后又关闭的时候,会得到一个返回值,这个返回值就是这个requestcode,你需要做的就是通过onActivityforResult()方法去进行对这个requestcode进行判断,处理好相应的逻辑
这个文章是我睡前写的,手机上面实在不好打字
在目的activity中获取intent启动源的名字的方法
1 先说在setClass启动一个Activity的方法吧:
Intent intent = new Intent();
intentsetClass(this, CreatePlaylistclass) //参数一为当前Package的context,t当前Activity的context就是this,其他Package可能用到createPackageContex()参数二为你要打开的Activity的类名
startActivity(intent);
2 通过Component Name来打开的方式
Intent intent = new Intent();
intentsetAction(IntentACTION_MAIN); //添加一些特性,具体可以查看Intent文档,相关属性的介绍
intentaddCategory(IntentCATEGORY_LAUNCHER);
intentsetFlags(IntentFLAG_ACTIVITY_NEW_TASK | IntentFLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
//通过Bundle向要打开的的Activity传递一些数据
Bundle bundle = new Bundle();
bundleputString("data", new String(" Hello World"));
intentputExtras(bundle);
intentsetComponent(new ComponentName(
new String("comandroidtestActivity"), new String("comandroidtestActivitytestActivity")));
startActivity(intent);
以上就是关于【BUG系列】getIntent()无法获取到值,Activity 是singTask 模式全部的内容,包括:【BUG系列】getIntent()无法获取到值,Activity 是singTask 模式、fragment中怎样getIntent()、安卓studio intent怎么用new intent()括号里的两个参数怎么填等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)