intent启动activity的方式(如何启动另外一个应用的任意Activity)
本文目录
- 如何启动另外一个应用的任意Activity
- Intent两种启动方式
- 启动activity
- Activity的启动模式有哪几种,分别用于什么
- activity的启动模式有哪些
- android 如何打开一个新的activity
- 如何用intent action 启动activity
- 如何启动一个activity涉及到哪些方法
- Intent.addFlags() 启动Activity的20种flags全解析
- 关于安卓intent启动activity的几种情况
如何启动另外一个应用的任意Activity
在一个Android应用程序A中调用另一个Android程序B,同时传递数据给BComponentName componentName = new ComponentName("com.xiaohua.player.activity","com.xiaohua.player.activity.PlayerActivity");Intent intent = new Intent();Bundle bundle = new Bundle();bundle.putString("resUrl", resurl);bundle.putSerializable("picUrlList", picurllist);intent.putExtras(bundle);intent.setComponent(componentName);startActivity(intent);注:com.xiaohua.player.activity:包路径PlayerActivity:Activity类resUrl :String类型picUrlList:数组,也可以是对象应用程序安装后,按以上方式可进行调用.接受activity:public void getParameterByIntent() {Intent mIntent = this.getIntent();String resUrl = mIntent.getStringExtra("resUrl");String) mIntent.getSerializableExtra("picUrlList");if (null != picUrlList) {int count = picUrlList.length;for (int i = 0; i 《 count; i++) {Log.e("tag", "picUrlList);}}}
Intent两种启动方式
显示启动:在构造Intent对象就指定接受者,这种方式跟函数调用类似。 1、Intent intent = new Intent(IntentDemo.this,ActivityToStart.class); 2、startActivity(intent); 隐世启动:在构造Intent对象时,该不知道也不关心接受者。 ***隐藏网址*** 2、startActivity(intent);
启动activity
application/vnd.ms-excel xls audio/mpeg mp3 image/gif gif image/jpeg jpg application/msword doc application/pdf pdf 1 隐式启动自己的活动 无论隐式启动自己的程序还是启动外部的程序,从原理上来说都是一致的 1.1 配置过滤器 1.1.1 每个activity都可以在清单文件中配置intent-filter,意图过滤器 1.1.2 在intent-filter中配置action,catagory,data,这三个参数用于过滤,即通过和这三个参数之间的匹配,确定要启动那个activity。 1.1.3 可以配置多个action,多个catagory,多个data。 如果显式启动程序,则不需要这三个参数,如果隐式启动程序,则至少需要一个action,一个catagory,data可以没有 1.1.4 action,和catagory中需要设置name,data主要可以设置scheme和mimetype,可以单独设置scheme或者单独设置mimetype,也可以既设置scheme,也设置mimetype。name,scheme,mimetype的值可以自己指定。 1.1.5 如果活动是主活动,即打开app自动启动的活动,则需要按下面的配置,格式是固定的,不能更改
如果活动不是主活动,而且需要隐式启动,则至少有一个action,名字随便,一个catagory 名字是android.intent.category.DEFAULT。其他的各种参数没有强制规定。 具体的格式如下
1.2 启动活动 1.2.1 活动的响应 启动活动需要使用intent对象,intent中设置action,catagory,data,action和catagory就是intent中定义的相应的名字,data需要设置mimetype和scheme。 如果没有设置data 则只要intent中设置的action和catagory在intent-filter中配置的action和catagory中都有,相应的活动就可以响应。例如1.1.5中配置的intent-filter,假设它没有配置data,现在有一个intent,设置了action为com.example.zyl,catagory为android.intent.category.DEFAULT那么这个活动就会被响应 如果设置了data action和catagory匹配规则不变,intent中设置的对应data的参数(mimeType,scheme等)必须要匹配其中的任何一个data,也就是intent中设置的对应data参数必须和intent-filter中设置的data完全一致,才能被响应。还是上面中的那个例子,现在有一个intent,设置了action为com.example.zyl,catagory为android.intent.category.DEFAULT,还需要设置data的mimetype为zzz,scheme为zyl,这个活动才能被响应 1.2.2 设置action 首先定义一个Intent对象,Intent是活动,广播,服务之前相互启动和通信的桥梁,并设置action,action就是zai有两种方式 第一种,直接在intent的参数中传入action
第二种,用setAction方法设置action
1.2.3 设置catagory 当要启动活动的时候,调用startActivity时,系统会自动为intent添加一个catagory属性,这个catagory属性的名字是android.intent.category.DEFAULT。也就是说所有隐式启动的活动都会有这个catagory这个属性,这也就是为什么活动的intent-filter中必须配置android.intent.category.DEFAULT这个属性。 所以,既然所有的intent-filter中都有android.intent.category.DEFAULT这个属性,而启动活动时系统又会为intent添加这个属性,那么catagory这个属性就不用自己配置也会匹配的。 如果想要进一步过滤的话,也可以为intent继续设置catagory这个属性。设置的方法是
传入需要过滤的catagory的名字 1.2.4 设置data 如果intent-filter中没有设置data,那么上面两步就可以隐式的启动一个活动了,但是如果intent-filter中设置了data属性,那么如果想要启动那个活动,就必须为intent设置data。 这里只说两个比较重要的data的属性,scheme和mimetype scheme scheme通过setData设置 产生一个Uri对象,如下。调用Uri.parse方法产生Uri对象,这个对象中传入一个字符串,中间用:分开,前面对应的就是scheme参数,这个scheme需要和intent-filter中配置的scheme一致,后面就是需要通过setData方法传入的参数。
然后 将Uri对象传入
mimeType 设置mimeType,如果intent-filter中设置了mimetype属性,则通过setType方法,为intent设置mimeType,这个mimeType需要和intent-filter中设置的mimeType一致,自己定义的mineType的格式必须满足 / 这种形式,*代表任何字符。
------------------------------一个重要的问题------------------------------------- 如果在intent-filter中只设置scheme或者只设置了mimeType,则用上面的方法就可以了。 但是如果intent-filter中同时设置scheme和mimeType,那么就会产生一个问题,因为调用setData时会屏蔽setType,而setType时,会屏蔽setData。所以这时需要用一个方法,同时设置data和mimeType。这个方法叫setDataAndType,如下
-----------------------------另一个说明-------------------------------------------- setData有两个作用,一个作用是匹配scheme,另一个作用是传递数据。 调用setData时,可以指定scheme也可以不指定scheme,如果intent-filter中配置了scheme,可以在setData指定scheme,启动这个活动同时传递数据,如果intent-filter中没有指定scheme,在setData时,可以不指定scheme,只传递数据,例如下面这种写法,,也是可以的。对于setData传递数据这一块,在下面数据的传递那一块进行说明。
2 隐式启动其他的应用程序 通过和意图过滤器相互匹配就可以打开相应的活动,所以只要知道其他应用的意图过滤器是怎么配置的,自然就可以通过隐式启动的方法启动其他app中的活动 2.1 打电话 2.1.1 设置action 跳转到拨号界面,不直接拨打,对应的action为Intent.ACTION_DIAL,这个是系统封装好的字符串,对应拨号界面的action 直接拨打电话,对应的action为Intent.ACTION_CALL
或者
2.2.2 设置scheme 还需要设置scheme为tel
2.2.3 开启权限 要实现打电话功能,还需要在manifest中注册权限
2.2.4 开启活动
以上四步就实现了打电话的功能 2.2 发短信 2.2.1 设置action
2.2.2 传递要发送的联系人和设置scheme
2.2.3 传递要发送的短信内容
2.2.4 开启活动
以上四布就可以进入发送短信的界面,但是要手动发送短信,如果想直接发送短信,需要借助发送短信的manager类方法,详情在manager那部分写着 3 打开各种文件 对于手机中的各种文件,如果想调用相应的程序打开这些软件,就可以使用Intent.ACTION_VIEW,通过设置data传入数据内容,通过设置type筛选打开文件的程序的类型。这时就需要采用setDataAndType 例子如下
上面的例子就会调取可以打开这个文件的程序,供用户选择。 主要的就是设置数据和type,数据就直接从文件中读取就可以了,最重要的就是通过type来过滤应用程序。下面列出一个主要的mimeType类型
如果显式启动程序,那么不需要配置任何的intent-filter 直接在intent中传入当前活动的对象,和要打开的活动的.class对象,然后开启活动即可
1 传递数据的方法 传递数据也通过intent,intent携带着数据,从一个活动,到另一个活动,传递数据有两种方法,一种是setData方法,一种是putExtra方法。无论是显式启动还是隐式启动,都可以调用这两种方法。 1.1 setData方法 1.1.1 在第一个活动中intent调用setData的方法,携带数据,传入一个Uri类型的数据,根据另一个活动中的相应配置,可以携带scheme参数,也可以不携带scheme参数
1.1.2 在另一个活动中接收数据 首先获取到传入的intent对象,然后通过getData()(返回一个Uri类型的数据),或者getDataString()(返回一直String类型的数据),如果传入的数据是一个String类型,则直接调用getDataString()就可以得到这个数据。
一般在自己的程序内部很少使用这种方式传递数据,当启动外部程序,外部程序又规定需要使用setData传递数据时,才会使用setData方式 1.2 putExtra方法 这种方法是传递数据最常用的方法 1.2.1 传递普通类型的数据 传入数据
获取数据
1.2.2 传递实体类对象的数据 想要传递实体类对象,首先创建实体类时要实现Serializable接口
现在准备实体类对象,和一个对象list
开始传递数据 第一种方式 传入数据时使用putExtra方式,即可以传入单个对象,也可以传入对象的list
获取数据
第二种方式 通过Bundle传递数据,同样既可以传入单个实体类对象,也可以传入实体类list 传入数据
接收数据
2 接收从下一个活动返回的数据 上面传递数据都是直接传递给下一个活动,现在想从下一个活动返回数据,启动活动是的方法就从startActivity变成了startActivityForResult 2.1 向下一个活动传递数据
2.2 下一个活动返回数据
2.3 第一个活动接收数据 想接收返回的数据,需要重写第一个活动的onActivityResult
Activity的启动模式有哪几种,分别用于什么
刚好最近又梳理了一下,结合我的实际使用场景回答一下= =
有四种启动模式,需要知道的是activity是交由activity栈(任务栈)管理的
standard : 会在启动时创建一个新实例入栈,所以每次打开都是一个新的界面
场景:默认模式,一般的activity用这个就好
singleTop:当启动activity时,有相同的activity在前台与用户交互,就复用这个activity,回调onNewIntent()方法,避免栈顶的activity被重复的创建;如果没在栈顶,依然会创建新的实例加在栈顶
场景:这个主要针对重复打开的情况,比如你点击通知栏,跳转到消息中心,如果此时消息中心已经打开,就不会重新打开新的界面,合乎逻辑
singleTask:类似singleTop,也是避免重复创建,唯一不同的是,当启动activity时,有相同的activity在栈内,会复用此activity,回调onIntent(),并清空此activity之上所有activity
场景:一般用于程序主界面,利用清空activity的特性,比如你在应用内,打开了多个界面,触发了某个操作后都需要跳转到首页,设置了singleTask之后,就直接启动主页就好,会把之前打开的全部关掉(免得你手动一个一个关闭activity)
singleInstance:顾名思义,单一实例,整个手机操作系统里面只有一个实例存在。不同的应用去打开这个activity 共享公用的同一个activity
场景:常见于系统呼叫来电界面,每个应用打开不会重新创建新的该拨打界面。这种模式比较少用,除非你确定需要使该Activity只有一个实例
最后,上面介绍是在默认没有指定taskAffinity的情况下(即包名),具体想要更深入或者实现更复杂的场景,请结合taskAffinty和Intent Flag具体分析,在此就不介绍了。
以上。
activity的启动模式有哪些
Activity的四种启动模式:standard:这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。singleTop: 如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。singleTask:如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。singleInstance:在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。位置在 AndroidManifest.xml 文件中 Activity 元素的 android:launchMode 属性。
android 如何打开一个新的activity
1、设置Intent
Intent intent = new Intent(当前Activity.this, 要打开的Activity.class);
2、通过startActivity打开activity
startActivity(intent);//打开新的activity
如何用intent action 启动activity
有下面两个方法供参考:1. 先说在setClass启动一个Activity的方法吧: Intent intent = new Intent(); intent.setClass(this, CreatePlaylist.class) //参数一为当前Package的context,t当前Activity的context就是this,其他Package可能用到createPackageContex()参数二为你要打开的Activity的类名 startActivity(intent); 2. 通过Component Name来打开的方式 Intent intent = new Intent(); intent.setAction(Intent.ACTION_MAIN); //添加一些特性,具体可以查看Intent文档,相关属性的介绍 intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); //通过Bundle向要打开的的Activity传递一些数据 Bundle bundle = new Bundle(); bundle.putString("data", new String(" Hello World")); intent.putExtras(bundle); intent.setComponent(new ComponentName( new String("com.Android.testActivity"), new String("com.android.testActivity.testActivity"))); startActivity(intent);
如何启动一个activity涉及到哪些方法
要启动一个新的Activity,我们可以通过调用Context中的startActivity来启动。像这样: Intent intent = new Intent(this, ActivityDemo.class); startActivity(intent); // ActivityDemo是需要启动的Activity类 通过上面的方法可以启动新的Activity了,但如果我要从当前的Activity中传递数据到新的Activity呢?很简单:Intent intent = new Intent(this,ActivityDemo.class); Bundle bundle = new Bundle(); bundle.putBoolean("bool_key", true); intent.putExtras(bundle); startActivity(intent); 还有,有时候我们需要启动带返回值的Activity,简单的说就是需要新启动的Activity返回时将值传递给启动它的Activity,像这样: Intent intent = new Intent(ActivityLifeDemo.this,RevalueActivity.class); startActivityForResult(intent, 0x1001); ActivityLifeDemo是当前的Activity,启动RevalueActivity,我们在ActivityLifeDemo中需要获取RevalueActivity传回来的值。那么在RevalueActivity中就必须这样写: Intent intent = new Intent(); intent.putExtra("revalue_key","haha-revalueActivity"); setResult(0x1001, intent); 那么“revalue_key”值在哪里获取呢?必须重写onActivityResult方法,通过判断requestCode,来确定 if(requestCode==0x1001){ String str = data.getStringExtra("revalue_key"); Log.i(TAG, "返回的值为:"+str); }
Intent.addFlags() 启动Activity的20种flags全解析
Activity是四大组件中最重要的一个,也是平时开发中接触最多的。与Activity启动行为相关的就是它的启动模式,Standard、SingleTop、SingleTask、SingleInstance这4种launchMode相信大家不陌生,如果不太熟悉可以看这里:
OK,熟悉了4种launchMode后相信你已经对Activity任务栈有一些理解了,能应对一些常见的开发场景了。然而,除了4种launchMode,还有更复杂的控制Activity行为的方式,那就是给启动Activity的Intent添加flag,使用 Intent.addFlags(int flags) 方法。看一下这个方法的参数,总共有20种:
这么多估计大家一看就晕了,我一开始也是这样。不过,仔细看每一条的文档,把它添加到你要启动的Activity上,然后观察Activity的行为,这样就容易弄明白它的含义。
在分析具体的flag之前,介绍一些Activity任务栈相关的概念:Activity、task、tasks、recent tasks list。这些概念都是抽象的,除了Activity和recent tasks list看得见之外,其他都是看不见摸不着的。如果没有直观的视觉感受,即使我说得天花乱坠你也可能还是云里雾里,而有了图甚至动画直接展示它们就不一样了。下面这个工具能很好地帮助我们:
有了ActivityTaskView,就能结合图来分析了。
它是应用中的放置活动的一个类似于栈的结构。栈顶的是最上面的活动,也就是用户直接看到的页面,顶部以下的活动都处于onStop状态(如果是可见的,那么处于onPause状态)。一般连续按返回键能自顶向下销毁活动。上图中的悬浮窗表示一个任务,在这个任务中启动了20多个活动。
虽然单个task是比较常见的应用,但是一个应用可以有多个task,创建新的task有好几种方法。上图中的悬浮窗的每一列表示一个任务,在这个应用中一共创建了三个任务。
老的安卓系统中长按home键出现的页面,新的系统直接按导航栏中的正方形按钮。这个列表表示最近启动的应用的tasks,表中每一项表示一个入口。需要注意的是,一个应用可能会出现多个入口,因为应用可能有多个任务,当然不一定每个任务都会出现在列表中。
下面结合动画来分析Intent中添加的flags。
public static final int FLAG_ACTIVITY_CLEAR_TASK = 0X00008000;
public static final int FLAG_ACTIVITY_CLEAR_TOP = 0x04000000;
public static final int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET = 0x00080000;
public static final int FLAG_ACTIVITY_MULTIPLE_TASK = 0x08000000;
public static final int FLAG_ACTIVITY_NEW_DOCUMENT = FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
public static final int FLAG_ACTIVITY_NEW_TASK = 0x10000000;
public static final int FLAG_ACTIVITY_NO_ANIMATION = 0X00010000;
public static final int FLAG_ACTIVITY_NO_HISTORY = 0x40000000;
public static final int FLAG_ACTIVITY_REORDER_TO_FRONT = 0X00020000;
public static final int FLAG_ACTIVITY_RETAIN_IN_RECENTS = 0x00002000;
public static final int FLAG_ACTIVITY_SINGLE_TOP = 0x20000000;
关于安卓intent启动activity的几种情况
我们一般写的比较简单的方法就是starActivity(new Intent(context,A.class)).这种启动的方式很简单,就是一个从当前界面跳转到下一个activity界面。 首先我们先要说一个问题,当你有弹窗信息,或者通知栏里面出现了通知,然后你点击进去,不知道你有没有在意,APP会在五秒钟之后打开,当然,有的不会 大多数还是会的。现在我们就说一下这个问题 在谷歌的 Android API Guides 中,特意提醒开发者不要在后台启动 activity,包括在 Service 和 BroadcastReceiver 中,这样的设计是为了避免在用户毫不知情的情况下突然中断用户正在进行的工作.就是当通过 home 键将当前 activity 置于后台时,任何在后台startActivity 的操作都将会延迟 5 秒,除非该应用获取了 "android.permission.STOP_APP_SWITCHES" 权限.但是这个权限是系统级别的权限. 解决方法:不能够用传统的startActivity来启动Activity Intent intent = new Intent(context, A.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent);而是要用以下形式来启动Activity: Intent intent = new Intent(context, A.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); try { pendingIntent.send(); } catch (PendingIntent.CanceledException e) { e.printStackTrace(); } OK,这种方式启动activity,一般是用在有后台任务的时候 starActivityforResult(),里面有两个参数,一个是intent,还有一个是requestcode,当你启动下一个界面的然后又关闭的时候,会得到一个返回值,这个返回值就是这个requestcode,你需要做的就是通过onActivityforResult()方法去进行对这个requestcode进行判断,处理好相应的逻辑这个文章是我睡前写的,手机上面实在不好打字
更多文章:
结束进程拒绝访问怎么解决(win8 怎么强制结束进程,在任务管理器里拒绝访问)
2024年6月25日 19:50
linux打包jar包命令(jar包启动命令(查看jar包内容命令))
2024年8月22日 02:50
python软件如何运行程序(运行python程序的两种方式)
2024年9月1日 05:15
怎么在PHP中定义和使用接口interface?php接口有什么作用
2024年7月22日 05:23
fastjson作者(fastjson 是否有注解转换属性值)
2024年7月9日 05:40
mybatis plus(mybatis-plus中可以使用if吗不在xml直接使用)
2024年6月26日 00:22
定时执行批处理文件(求做个批处理文件BAT,完成定时执行任务功能)
2024年6月30日 02:26