四大组件之一Activity

来源:互联网 发布:sdrsharp软件 编辑:程序博客网 时间:2024/05/16 04:19

1.显式Intent和隐式Intent

      1.1 显式Intent很简单,稍微懂点android的都知道,我只举一个例子,大家就明白了。

            

      Intent intent = new Intent(FirstActivity.this,SecondActivity.class);      startActivity(intent)

     1.2重点讲解隐式Intent

          我们需要修改SecondActivity的注册配置。

         

        <activity android:name=".SecondActivity">           <intent-filter>             <action android:name="自己随意定义的字符窜,最好是自己的包名开头,例如com.example.activity.ACTION_SATRT"/>              <category android:name="android.intent.category.DEFAULT"/>           </intent-filter>        </activity>

       那么我们在跳转到这个activity类中的时候就要这样写。

           

       Intent intent = new Intent(“com.example.activity.ACTION_START”);       startActivity(intent)

      你也许会问,怎么没有指定category呢,其实android.intent.category.DEFAULT是一种默认的category,在调用startActivity中会自动将这个category添加到intent。

      每个Intent只能指定一个action,但可以指定多个category.举个例子

          

      <activity android:name=".SecondActivity">          <intent-filter>             <action android:name="自己随意定义的字符窜,最好是自己的包名开头,例如com.example.activity.ACTION_SATRT"/>             <category android:name="android.intent.category.DEFAULT"/>             <category android:name="android.intent.category.MY_CATEGORY"/>         </intent-filter>      </activity>

      那么我们在跳转到这个activity类中的时候就要这样写。

      

      Intent intent = new Intent(“com.example.activity.ACTION_START”);      intent.addCategory("com.example.activity.MY_CATEGORY")      startActivity(intent)

    像这种隐式的Intent,Android内置了很多,比如打开浏览器

       

         Intent intent = new Intent(Intent.ACTION_VIEW);      intent.setData(Uri.parse("http://www.baidu.com"))      startActivity(intent)


       <intent-filter>中还可以配置data标签,用于更精确的指定当前活动能够响应什么类型的数据,这个标签主要可以配置一下内容。

      android:scheme: 用于指定数据的协议部分,如http,ftp,https

      android:host : 用于指定数据的主机名部分,如"www.baidu.com"

     android:port: 用于指定数据的端口部分,一般紧随在主机名之后,比如:5037端口

    android:path:用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。

    android:mimetype:用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

   记住,只有data标签中指定的内容和Intent中携带的Data完全一致时,当前活动才可响应该Intent。不过一般data中不会指定太多内容,很多时候也很少用这个标签。

  当然你也可以自己写一个activity在AndroidManifest.xml中去配置自己的浏览器,只是内置的调用的是系统的浏览器,你若想自己配置必须自己写好这个浏览器功能,才能调用。自己配置如下:

      

      <activity android:name=".ThirdActivity">          <intent-filter>             <action android:name="android.intent.action.VIEW"/>             <category android:name="android.intent.category.DEFAULT"/>             <data android:scheme="http"/>          </intent-filter>      </activity>

      至于运行出来是什么样的,你可以试一下。

2.Activity的生命周期

      这个是学android必备的技能,但是很多人可能只知道onCreate(),onStart(),onResume(),onPause(),onStop(),onDestroy()以及onRestart(),但对什么时候用到这些方法并不了解,我只说一下难理解的几个。

     1.如果一个活动处于onPause()状态(用户可见,但是不能操作)重新回到该活动,则会onpause()->onResume()

     2.如果一个活动处于onStop()状态(用户不可见,还面临被内存紧张时被杀掉的危险),如果 未被杀掉,则会onRestart()->onStart()->onResume;如果已经被杀掉,则会onCreate()重新创建一次,这个时候之前的数据就没有了,我们为了防止这样的事情发生,需要在onSaveInstanceState()回调方法中去保存一下当前活动所需要的数据,然后在onCreate()中去创建的时候取出来用就好了。

   其他的应该没有特殊的了。

 3.Activity的启动模式

    启动模式分为四种standard,singleTop,singleTask和singInstance.这个知识虽然在初学的时候,甚至是做一些项目的遇不到这个知识点,但我觉得很重要,因为有时候一个小bug你到处找都找不到原因,有可能就是你的启动模式设置错误了,至少这个问题我遇到过,也就是那个时候我才知道哇塞,Android还要这属性配置呢,就赶紧研究一下。

    这个配置属性是在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式的。

    3.1.standard

      这个很简单,每一个app都有一个自己的返回栈,你每启动一个Activity都会入栈,不管这个栈中有没有这个Activity,比如你从FirstActivity跳转到SecondActivity,又从SecondActivity跳转到FirstActivity()中,那么这个栈中就会有2个FirstActivity,2个SecondActivity。

    3.2.singleTop

      这个也不难。比如你打开了FirstActivity,然后你从FirstActivity跳转到FirstActivity那么这个栈中只会有一个FirstActivity,不过这种情况在项目中不常遇见,貌似只有Activity+Fragment前端框架才有可能用到,但是一定要注意更新数据问题。

     如果FirstActivity不在栈顶,那么下次跳转到FirstActivity中还会创建一个。

    3.3. singleTask

       如果用这种启动模式,每个活动在整个程序的上下文中只会存在一个实例,也就是说每次启动该活动的时候系统会首先在返回栈中检查是否存在该活动的实例,如果发现已存在,则直接使用该实例,并把这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。

       举个例子,在SecondActivity中启动FirstActivity时,如果已经有FirstActivity的实例,并且secondActivity在其上面,那么SecondActivity就会从返回栈中出栈,而FirstActivity重新成为了栈顶活动,这个时候FirstActivity的状态从onstop()->onRestart(),而SecondActivity的状态从onResume->onPause->onStop()->onDestory().

 3.4. singleInstance

     这个算是最特殊也是最复杂的一个了,我们之前说了,每个app一般都会有一个返回栈,但是如果你把某一个Activity的启动模式设置为这个,那么这个Activity独享一个返回栈来管理这个活动(其实如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈)

    这个启动模式比较适用于多个app共享一个activity活动的场景。不管是哪个app来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。

   举个例子

   我们从FirstActivity跳转到SecondActivity(这个Activity的启动模式我们设置为singleInstance),再从SecondActivity跳转到ThirdActivity。当我们按下back键时,你会发现ThirdActivity直接返回到了FirstActivity,在按back键才会回到SecondActivity,最后再按back键才会退出这个app。

     这就是因为FirstActivty和ThirdActivity在同一个栈中,而SecondActivity是在另一个栈中,会先清空当前活动所在的栈,然后再去清空另一个栈。


    今天就先总结这么多吧,有错误的请大家指出来,喜欢的同学希望可以顶一下,鼓励本人可以继续写下去哈。

1 0
原创粉丝点击