Android菜鸟学步之Intent

来源:互联网 发布:知乎 好书推荐 编辑:程序博客网 时间:2024/04/29 08:53

Intent

Intent分为显式和隐式,显式的在前面实际上已经用过很多次了,这里主要讲隐式。

显式Intent

先在AndroidManifest中注册,(实际上在Android studio中如果是新建的一个Activity,这一步是完全需要的,如果是自己建立的Java文件和xml文件,那么需要手动配置一下注册信息),注册信息很简单:

 <activity android:name=".MyAty" />    <activity android:name=".Main2Activity">  </activity>

上面一个是我手动注册的,另一个是建立Activity时自动注册的,并没有什么区别。
startActivity(new Intent(MainActivity.this,MainActivity.class));

隐式Intent

  1. 配置Action
    AndroidManifest中配置相关信息,在Activity中添加一个子标签intent-filter,用DEFAULT即默认的category,而默认的行为方式为Activity,接下来再指明一个action,事实上它可以为任意一个字符串,启动的时候根据这个字符串来启动。我写的是abcdefg
    然后在
<activity android:name=".MyAty">            <intent-filter>                            <categoryandroid:name="android.intent.category.DEFAULT"/>                 <action android:name="abcdefg"/>            </intent-filter>        </activity>

接下来在MainActivity的Intent中直接传上面的字符串进来:
startActivity(new Intent("abcdefg"));
以上过程经过测试
值得注意的是,为了统一或者说,为了方便调用,对于上面的字符串,在编程中大家有了一个约定俗成的格式,就是包名.intent.action.Activity名,比如
com.example.hp.lanchmode.intent.action.MyAty
如果都按照这个格式的话我们进行调用就比较方便了。
这确实是一个好方法,但是也有一个显著的缺点,难记!太长了嘛。所以我们在被启动的Activity中定义一个静态常量字符串
public static final String ACTION=
"com.example.hp.lanchmode.intent.action.MyAty";

这样我们就不用在MainActivity中用那么长的内容来启动了,直接:
startActivity(new Intent(MyAty.ACTION));这样就调用了那么长的一个字符串了,就可以实现启动了啊,其实很简单,其实很自然。
这种启动方式其实还可以用作不同应用间的Activity启动,因为在A应用里面是不可能获得B应用的类定义的,那么就可以用action的方式来启动。
首先在工程中new一个module,然后命名为app2,之后一键next下去,就建立了一个新的应用,如果打开模拟器,会发现确实出现了名为app2的应用。
然后我们在这个应用的Activity

startActivity( new Intent("com.example.hp.lanchmode.intent.action.MyAty"));

这样就可以实现跨应用访问Activity了
就可以了。这里我比较奇怪的是,为什么上面说了用My.ACTION,现在不用了。
那么如果不想让别的应用访问呢?只需要在AndroidManifest写这么一句:
<activity android:name=".MyAty" android:exported="false">
androd:exported默认是true的,也就是说默认是可以访问的,我们改为false就只能在一个应用程序的内部进行访问了。

我们在上面已经了解到在Intent-filter中定义action可以以字符串的方式进行启动,那么如果我们在两个不同的Activity中定义相同的action的字符串呢,会启动哪一个呢?实际上,会给我们选择,让我们挑选一个进行打开,这就好比我们在qq里面要打开一个链接,可能会让我们选择用哪个浏览器来进行打开。
为了解决这样一个问题,其实还有方法,就是在Intent-filter中配置data信息,这个不再说了。

那么我就想问了,Intent(包括隐式和显式)特别是隐式启动的原理是什么呢?它的运作过程是怎么样的呢,现在我是知道了靠调用这个startActivity就可以启动另一个Activity,那么是怎么实现的呢?这些还有待深究。

0 0