启动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自动启动的活动,则需要按下面的配置,格式是固定的,不能更改

 <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

如果活动不是主活动,而且需要隐式启动,则至少有一个action,名字随便,一个catagory 名字是android.intent.category.DEFAULT。其他的各种参数没有强制规定。
具体的格式如下

<activity android:name=".Main2Activity">
            <intent-filter>
                <action android:name="com.example.zyl"/>
                <action android:name="com.example.zzz"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="com.mycategory"/>
                <data android:scheme="zyl"
                      android:mimeType="zzz/zyl"/>
            </intent-filter>
        </activity>

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

Intent intent=new Intent("com.example.zyl")

第二种,用setAction方法设置action

Intent intent=new Intent();
intent.setAction("com.example.zyl");

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这个属性。设置的方法是

intent.addCategory("com.mycategory");

传入需要过滤的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 uri=Uri.parse("zyl:1111111");

然后
将Uri对象传入

intent.setData(uri)

mimeType
设置mimeType,如果intent-filter中设置了mimetype属性,则通过setType方法,为intent设置mimeType,这个mimeType需要和intent-filter中设置的mimeType一致,自己定义的mineType的格式必须满足/这种形式,*代表任何字符。

intent.setType("zzz/zyl")

------------------------------一个重要的问题-------------------------------------
如果在intent-filter中只设置scheme或者只设置了mimeType,则用上面的方法就可以了。
但是如果intent-filter中同时设置scheme和mimeType,那么就会产生一个问题,因为调用setData时会屏蔽setType,而setType时,会屏蔽setData。所以这时需要用一个方法,同时设置data和mimeType。这个方法叫setDataAndType,如下

Uri uri=Uri.parse("123");
intent.setDataAndType(uri,"zzz/zyl");

-----------------------------另一个说明--------------------------------------------
setData有两个作用,一个作用是匹配scheme,另一个作用是传递数据。
调用setData时,可以指定scheme也可以不指定scheme,如果intent-filter中配置了scheme,可以在setData指定scheme,启动这个活动同时传递数据,如果intent-filter中没有指定scheme,在setData时,可以不指定scheme,只传递数据,例如下面这种写法,,也是可以的。对于setData传递数据这一块,在下面数据的传递那一块进行说明。

 Uri uri=Uri.parse("123");
 intent.setData(uri)

2 隐式启动其他的应用程序
通过和意图过滤器相互匹配就可以打开相应的活动,所以只要知道其他应用的意图过滤器是怎么配置的,自然就可以通过隐式启动的方法启动其他app中的活动
2.1 打电话
2.1.1 设置action
跳转到拨号界面,不直接拨打,对应的action为Intent.ACTION_DIAL,这个是系统封装好的字符串,对应拨号界面的action
直接拨打电话,对应的action为Intent.ACTION_CALL

Intent intent=new Intent();
intent.setAction(Intent.ACTION_DIAL);

或者

Intent intent=new Intent();
intent.setAction(Intent.ACTION_CALL);

2.2.2 设置scheme
还需要设置scheme为tel

intent.setData(Uri.parse("tel:10086"));

2.2.3 开启权限
要实现打电话功能,还需要在manifest中注册权限

 <uses-permission android:name="android.permission.CALL_PHONE"/>

2.2.4 开启活动

startActivity(intent);

以上四步就实现了打电话的功能
2.2 发短信
2.2.1 设置action

Intent intent=new Intent();
intent.setAction(Intent.ACTION_SENDTO);

2.2.2 传递要发送的联系人和设置scheme

intent.setData(Uri.parse("smsto:10086"));

2.2.3 传递要发送的短信内容

intent.putExtra("sms_body","aaa");

2.2.4 开启活动

startActivity(intent);

以上四布就可以进入发送短信的界面,但是要手动发送短信,如果想直接发送短信,需要借助发送短信的manager类方法,详情在manager那部分写着
3 打开各种文件
对于手机中的各种文件,如果想调用相应的程序打开这些软件,就可以使用Intent.ACTION_VIEW,通过设置data传入数据内容,通过设置type筛选打开文件的程序的类型。这时就需要采用setDataAndType
例子如下

//这里获取了一个excel文件
        File file=new File(Environment.getExternalStorageDirectory(),"/download/a.xls");
        Intent intent=new Intent();
        //设置action
        intent.setAction(Intent.ACTION_VIEW);
        //设置data,data是一个Uri类型,把文件转化为Uri类型有一个方法Uri.fromFile()
        //设置type为text/plain
        intent.setDataAndType(Uri.fromFile(file),"text/plain");
        startActivity(intent);

上面的例子就会调取可以打开这个文件的程序,供用户选择。
主要的就是设置数据和type,数据就直接从文件中读取就可以了,最重要的就是通过type来过滤应用程序。下面列出一个主要的mimeType类型

打开文本类型的文件:text/plain
打开图像文件:image/*
打开视频文件:video/*
显式启动

如果显式启动程序,那么不需要配置任何的intent-filter
直接在intent中传入当前活动的对象,和要打开的活动的.class对象,然后开启活动即可

//如果这句话在活动内部,传入this就可以,
// 如果在匿名类中或者不直接在活动内部,需要调用  类名.this 或者getActivity
Intent intent=new Intent(this,Main2Activity.class);
startActivity(intent);
数据的传递

1 传递数据的方法
传递数据也通过intent,intent携带着数据,从一个活动,到另一个活动,传递数据有两种方法,一种是setData方法,一种是putExtra方法。无论是显式启动还是隐式启动,都可以调用这两种方法。
1.1 setData方法
1.1.1
在第一个活动中intent调用setData的方法,携带数据,传入一个Uri类型的数据,根据另一个活动中的相应配置,可以携带scheme参数,也可以不携带scheme参数

intent.setData(Uri.parse("saafd"));

1.1.2
在另一个活动中接收数据
首先获取到传入的intent对象,然后通过getData()(返回一个Uri类型的数据),或者getDataString()(返回一直String类型的数据),如果传入的数据是一个String类型,则直接调用getDataString()就可以得到这个数据。

getIntent().getDataString();

一般在自己的程序内部很少使用这种方式传递数据,当启动外部程序,外部程序又规定需要使用setData传递数据时,才会使用setData方式
1.2 putExtra方法
这种方法是传递数据最常用的方法
1.2.1 传递普通类型的数据
传入数据

 //以key-value的形式传入
        //传入数字类型,字符串,boolean类型
        intent.putExtra("key","value");
        //传入整型list
        intent.putIntegerArrayListExtra("key",list);
        //传入String类型list
        intent.putStringArrayListExtra("key",value);

获取数据

 //获取传入的String类型的数据
        getIntent().getStringExtra("key");
        //获取int,double数据,第二个参数是没有成功接收时的默认值
        getIntent().getDoubleExtra("key",1.0);
        getIntent().getIntExtra("key",1);
        //获取list
        getIntent().getIntegerArrayListExtra("key");
        getIntent().getStringArrayListExtra("key");

1.2.2 传递实体类对象的数据
想要传递实体类对象,首先创建实体类时要实现Serializable接口

public class Person implements Serializable {
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private int age;
    private String name;
}

现在准备实体类对象,和一个对象list

        Person p1=new Person();
        p1.setAge(1);
        p1.setName("aaa");
        Person p2=new Person();
        p2.setName("bb");
        p2.setAge(2);
        ArrayList<Person> list=new ArrayList<>();
        list.add(p1);
        list.add(p2);

开始传递数据
第一种方式
传入数据时使用putExtra方式,即可以传入单个对象,也可以传入对象的list

//传入单个对象
intent.putExtra("key",p1);
//传入对象list
intent.putExtra("key1",list);

获取数据

//单个对象
//首先获取到对象
Person p1=(Person)getIntent().getSerializableExtra("key");
//再获取到对象中的数据
Log.i("test",p1.getName());
//对象list
ArrayList<Person> list=(ArrayList<Person>) getIntent().getSerializableExtra("key1");

第二种方式
通过Bundle传递数据,同样既可以传入单个实体类对象,也可以传入实体类list
传入数据

------------------传入单个对象---------------------------------
//创建一个Bundle对象
Bundle bundle=new Bundle();
//调用putSerializable传入实体类对象
bundle.putSerializable("key",p1);
//把bundle传入intent
intent.putExtras(bundle);
------------------传入对象list---------------------------------
 //创建一个Bundle对象
Bundle bundle=new Bundle();
//调用putSerializable传入实体类对象list
bundle.putSerializable("key",list);
//把bundle传入intent
intent.putExtras(bundle);

接收数据

------------------接收单个对象---------------------------------
//首先获取到intent,然后通过getExtras()获取到Bundle对象,再通过getSerializable获取到实体类对象
Person p=(Person)getIntent().getExtras().getSerializable("key");
------------------接收对象list---------------------------------
//首先获取到intent,然后通过getExtras()获取到Bundle对象,再通过getSerializable获取到实体类对象list
ArrayList<Person> list=(ArrayList<Person>) getIntent().getExtras().getSerializable("key");

2 接收从下一个活动返回的数据
上面传递数据都是直接传递给下一个活动,现在想从下一个活动返回数据,启动活动是的方法就从startActivity变成了startActivityForResult
2.1 向下一个活动传递数据

这个方法接收两个参数,一个intent,一个requstCode请求码,是一个int类型,可以自己指定
startActivityForResult(intent,1);

2.2 下一个活动返回数据

        //首先创建一个intent对象用于携带参数
        Intent intent=new Intent();
        //放入参数
        intent.putExtra("key","aaa");
        //调用setResult传入intent,将数据传回第一个活动
        //第一个参数是resultCode返回码,第二个参数是intent
        setResult(1,intent);
        //结束当前活动
        finish();

2.3 第一个活动接收数据
想接收返回的数据,需要重写第一个活动的onActivityResult

//该方法中的Intent对象,就是从下一个活动返回的intent
//通过判断请求码和返回码进行相应的处理
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode)
        {
            case 1:
                if(resultCode==1)
                    data.getStringExtra("key");
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,327评论 0 17
  • 显示Intent和隐式Intent Android中的Intent是一个非常重要且常用的类,可以用来在一个组件中启...
    狮_子歌歌阅读 1,142评论 0 2
  • Intent 是 Android 非常常用的一个用于组件间互相通信的信息对象,常用于启动组件和传递数据,大部分的程...
    seven_Android阅读 34,287评论 1 38
  • 移动互联网的出现,不仅波及了互联网行业,诸多传统行业也被波及,比如物流行业,企业、司机、仓储、末端配送、用户等,都...
    郭静阅读 257评论 0 1
  • 在那遥远的地方 有个美丽的阿克苏 那里的天是那么的蔚蓝 那里的土地是那么的宽广 那里辛勤劳作的人们有我那河南老乡 ...
    白丰阁阅读 534评论 2 4