本文出自:http://blog.csdn.net/berber78/article/details/7278408
一. intent.setFlags()方法中的参数值含义:
1.FLAG_ACTIVITY_CLEAR_TOP:例如现在的栈情况为:A B C D 。D此时通过intent跳转到B,如果这个intent添加FLAG_ACTIVITY_CLEAR_TOP标记,则栈情况变为:A B。如果没有添加这个标记,则栈情况将会变成:A B C D B。也就是说,如果添加了FLAG_ACTIVITY_CLEAR_TOP标记,并且目标Activity在栈中已经存在,则将会把位于该目标activity之上的activity从栈中弹出销毁。这跟上面把B的Launch mode设置成singleTask类似。简而言之,跳转到的activity若已在栈中存在,则将其上的activity都销掉。
2.FLAG_ACTIVITY_NEW_TASK:例如现在栈1的情况是:A B C。C通过intent跳转到D,并且这个intent添加了FLAG_ACTIVITY_NEW_TASK标记,如果D这个Activity在Manifest.xml中的声明中添加了Task affinity,系统首先会查找有没有和D的Task affinity相同的task栈存在,如果有存在,将D压入那个栈,如果不存在则会新建一个D的affinity的栈将其压入。如果D的Task affinity默认没有设置,则会把其压入栈1,变成:A B C D,这样就和不加FLAG_ACTIVITY_NEW_TASK标记效果是一样的了。注意如果试图从非activity的非正常途径启动一个activity(例见下文“intent.setFlags()方法中参数的用例”),比如从一个service中启动一个activity,则intent比如要添加FLAG_ACTIVITY_NEW_TASK标记(编者按:activity要存在于activity的栈中,而非activity的途径启动activity时必然不存在一个activity的栈,所以要新起一个栈装入启动的activity)。简而言之,跳转到的activity根据情况,可能压在一个新建的栈中。
3.FLAG_ACTIVITY_NO_HISTORY:例如现在栈情况为:A B C。C通过intent跳转到D,这个intent添加FLAG_ACTIVITY_NO_HISTORY标志,则此时界面显示D的内容,但是它并不会压入栈中。如果按返回键,返回到C,栈的情况还是:A B C。如果此时D中又跳转到E,栈的情况变为:A B C E,此时按返回键会回到C,因为D根本就没有被压入栈中。简而言之,跳转到的activity不压在栈中。
4.FLAG_ACTIVITY_SINGLE_TOP:和Activity的Launch mode的singleTop类似。如果某个intent添加了这个标志,并且这个intent的目标activity就是栈顶的activity,那么将不会新建一个实例压入栈中。简而言之,目标activity已在栈顶则跳转过去,不在栈顶则在栈顶新建activity。
二.intent.setFlags()方法中参数的用例:
很多人使用startActivity时候,会碰到如下的异常:
Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
都知道,Context中有一个startActivity方法,Activity继承自Context,重载了startActivity方法。如果使用Activity的startActivity方法,不会有任何限制,而如果使用Context的startActivity方法的话,就需要开启一个新的task(编者按:参见一.2.的编者按),遇到上面那个异常的,都是因为使用了Context的startActivity方法。
解决办法是:Java代码中加一个flag,即intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)。这样就可以在新的task里面启动这个Activity了。
分享到:
相关推荐
- **putExtra()方法**:用于向Intent中添加额外的数据。 ```java intent.putExtra("key", "value"); ``` - **getExtras()方法**:获取Intent中的额外数据。 ```java Bundle extras = getIntent().getExtras();...
为了封装这个过程,你可以创建一个静态方法,接受文件路径和MIME类型作为参数,返回一个Intent对象。然后在需要调用的地方,直接调用这个方法,传入相应的参数即可。例如: ```java public static Intent ...
4. **传递数据**: 如果需要传递数据,可以使用`putExtra()`方法将键值对添加到Intent中。 ```java intent.putExtra("key", "value"); ``` 5. **启动Intent**: 最后,调用当前Activity的`startActivity()`方法来...
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(intent); ``` - **重启**:类似地,重启设备可以通过发送一个ACTION_REBOOT Intent来实现。下面的代码展示了如何发送这个Intent来请求...
这个方法需要设置一个 boolean 参数,true 在任何 Activity 中按下返回键都退出并进入后台运行,false 只有在根 Activity 中按下返回键才会退向后台运行。 2、使用 Intent,返回手机主界面 ```java Intent intent =...
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); // 重启 Intent intent2 = new Intent(Intent.ACTION_REBOOT); intent2.putExtra("nowait", 1); intent2.putExtra("interval", 1);...
// 注意:ComponentName的第二个参数必须加上点号(.) shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp)); // 快捷方式的图标 ShortcutIconResource ...
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } } ``` - 注意,Android 6.0(API 23)及以上版本需要在运行时请求`WRITE_EXTERNAL_STORAGE`权限。 5. **处理更新逻辑** ...
在Android开发中,Intent是应用程序之间、组件之间通信的核心机制,它是Android系统中的一种消息对象,用于在不同的组件之间传递数据和启动操作。本资料主要针对Intent的初级学习,涵盖了Intent的基本概念、创建方法...
- **请求下载**: 使用DownloadManager的enqueue方法发起下载请求,传入一个DownloadManager.Request对象,设置URL、保存路径等参数。 ```java DownloadManager.Request request = new DownloadManager.Request...
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION); context.startActivity(intent); } } ``` 然后,为了让服务能够被其他应用调用,需要在`AndroidManifest.xml`中声明...
4. 在Unity中调用C#脚本中的方法,传递参数并触发Android端的方法。 通过这样的方式,开发者可以实现Unity游戏在Android平台上调用浏览器拉起应用市场,从而实现热更新或引导用户评价等功能。这种方式既充分利用了...
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(intent); ``` - 上述代码创建了一个意图对象,并设置了相关参数,最后通过`startActivity()`方法启动该意图,从而触发重启流程。 3. ...
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 添加读取权限 intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true); // 对于安装,还需添加此参数 context.startActivity(intent); ``` 这里的`...
// 设置其他参数... long downloadId = dm.enqueue(request); // 创建并注册广播接收器 BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent ...
在Android系统中,`... intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } } } ``` 记得在AndroidManifest.xml中注册BroadcastReceiver,并添加对ACTION_VIEW的权限: ```xml ...
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } } ``` 在应用启动时,注册广播接收器: ```java IntentFilter filter = new IntentFilter(DownloadManager.ACTION_...
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); ``` 这段代码会启动一个新的Activity,显示APK的安装界面,用户点击确认后即可开始安装。 3. **一个简单可运行的Demo** 一个完整的...
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); ``` 以上就是使用OkHttp3在Android中实现APP版本更新的主要流程。结合MVP(Model-View-Presenter)架构,可以更好地组织代码,...
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } // 错误处理 private void handleDownloadError(Exception e) { // 显示错误信息 } ``` 以上就是实现Android版本更新的基本流程,...