Activity的基本理解

作者: 沈凤德 | 来源:发表于2017-02-09 14:35 被阅读200次

     Activity:是Android的四大组件之一,主要处理界面的显示相关。


    Activity的生命周期:

    来自:http://blog.csdn.net/liuhe688/article/details/6733407

    onCreat():在Activity创建的时候执行,接受参数Bundle savedInstanceState,一般用于初始化数据。(savedInstanceState参数说明:主要用于当Activity被异常杀死的时候,用于保存数据);

    onStart():在Activity由不可见变为可见的时候调用,一般不进行任何操作;

    onResume():Activity变成可见,获得焦点与用户进行交流,前台状态。

    onPause():Activity可见,但是没有获得焦点,属于暂停状态,不处于栈顶当时可以看见界面;

    onStop():Activity变成完全不可间的时候调用,进入后台状态;一般可以释放一些消耗资源的程序;

    onDestory ():Activity被销毁的时候调用;


    图中具有三个向上的流程进行一一说明:

    第一条  onStop()——onRestart()——onStart();

    当Aacitvity没有被回收,不可见,或则说没有处于栈顶时,被再次启动的时候就会执行第一条流程。

    第二条 onPause()——onResume()

    Activity由失去焦点状态进入获得焦点状态(AlderDialog消失的时候会进行第二条流程)

    第三条 onStop()——onCreat();

    Activity当处于后的时候,被系统意外回收时会进行第三条流程;

    在系统回收之前会调用onSaveInstanceState();保存示例状态;在onCreat()时候调用onRestartInstanceState(BundlesavedInstanceState)

    onSaveInstanceState()执行时机:调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。


    如何销毁一个Acitvity?

    直接调用finish()方法,进行销毁。

    会执行的生命周期:onPause(),onStop(),onDestory().


    BaseActivity的说明:一般在开发中,所有的Activity都不会直接继承自Activity,而是继承自BaseActivity,而BaseActivity继承自Activity;可以在BaseActivity中写一些接口,动态权限的添加,沉浸状态栏等;


    Activity的启动模式:详细见网址:http://blog.csdn.net/guolin_blog/article/details/41087993

    首先是启动模式的设置:可以manifest清单文件中通过launchModel来设置,也可以通过Intent       中添加flag来完成启动模式的设置。当两种模式都设置了启动模式限制,Intent的更优先(广播机制中也是动态注册广播优先于静态注册的广播);

            在具体说明启动模式的时候,先说以下,系统管理Activity的管理基本过程,系统通过返回站的模式管理,是一种先进后出的模式。

    在manifest文件中进行模式设置:


    standard:默认启动模式

    当我们没有在清单文件中设置Activity的启动模式的时候,我们采用的就是这种启动模式;

    这总模式是指,当我们启动设置这个模式的Activity,就会新建一个Activity实例,并切放置在栈顶。

    singleTop:栈顶唯一

    当我们启动Activity的时候首先会进行判断,该activity是否位于站定,如果位于站定,则不创建新的Acitvity,如果不位于栈顶,则创建新的实例,并放入到栈顶;

    singleTask:任务唯一

    启动自身Activity的情况:当启动自身Activity的时候,就会先判断任务栈是否具有当前Activity,如果没有新创建,并至于栈顶。如果具有该Activity,就会将该Activity之前所有的Activity出栈,将改Activity至于栈顶。

    启动其他应用的Activity:当启动他应用设置singleTask的Activity的时候,就会新启动一个任务,并将其放到栈顶;

    singleInstance:单实例

    启动的Activity会新建一个任务,并且这个任务中只有这一个Activity,当这个Activity启动其他Activity的时候会放在其他任务中。

    Intent的启动模式说明:??


    Activity的沉浸模式:http://blog.csdn.net/guolin_blog/article/details/51763825

    几种功能:首先隐藏或则透明状态栏,隐藏或则透明导航栏,真正的沉浸式模式。


    Intent:在Activty,Service,Broadcast之间都有使用。

    Intent在Activity之间的使用:分为显示Intent与隐式Intent两种;

    首先说的显示Intent的使用方法:

    Intent  intent=new Intent(MainActivity.this,SecondClass.class);

    //参数说明:第一个参数为上下问对象(context),当然也可以是其子类;

    //第二个参数为想要启动的目标活动

    startActivity(intent);

    //启动相应意图,完成跳转


    隐式意图:隐式意图比显示意图含蓄的多;

    不明确指出我们要启动哪一个活动,而是指定了一系列更为抽象的action与category等信息,然后交给系统去分析,并启动相应的activity;

    基本行动原理解析:当在新建Intent的时候会指定action与category;action在每个Intent中只能有一个,而category可以又多个(当写的时候为默认android.intent.category.DEFAULT);在AndroidManifest中activty中添加<intent-filter>标签,在intent-filter中添加action与category;只又intent中的action与category同时与intent-filter中的action与category匹配的时候,这个活动就会相应;

    代码示例:

    //发送隐士意图

    Intent intent=new Intent("com.this.action");

    //采用构造方法添加action

    intent.addCategory("com.this.category");

    //通过addCategory添加category,如果不添加也会又默认的category;

    startActivity(intent);

    //接受隐式意图的Activity

    需要在AndroidManifest中添加intent-filter

    <activty  android :name=".SecondActivity">

    <intent-filter>

    <action android:name="com.this.action"/>

    <category android:name="com.this.category"/>

    </intent-filter>

    </activity>

    隐式意图的其他使用方法:可以用于开启其他应用的activity。

    (当我们用系统的浏览器,或则打电话,或则分享到微信,都是启动其他应用的activity)

    举例说明:启动系统浏览器

    Intent   intent=new  Intent("Intent.ACTION_VIEW");

    intent.setData(Uri.parse("http://www.baidu.com"));

    startActivity(intent);

    关于setData()方法说明:

    在intent-filter标签中有个类似与category的标签<data>,

    <data>用于指定当前活动能够响应什么数据。

    <data>配置具体内容:

    android.scheme-用于指定数据的协议部分,例如http协议;

    android.host--用于指定数据的主机部分,如上例中的wwwbaidu.com.

    android.port--用于指定端口号;

    android.path--用于指定端口好后的部分

    android.mineType--指定可以处理的数据类型;

    只有<data>标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够相应该Intent。(不过一般Intent不会指定过多内容,浏览器只指定了协议)

    代码示例:

    Intent  intent=new  Intent("Intent.ACTION_VIEW");

    intent.setData(Uri.parse("http://www.baidu.com"));

    startActivity(intent);

    <intent-filter>

    <action android:name="android.intent.action.View"/>

    <category android:name="android.intent.category.DEFAULT">

    <data android: scheme="http">

    </intent-filter>

    只有action category data  同时匹配时候,才会启动相应的activity;


    向下一个活动传递数据:Intent不但可以启动其他活动,也可以向下一个活动传递数据,也可以将数据返回到上一个。

    intent提供了一系列的putExtra()方法的重载,可以把我们要传递的数据存在Intent中,启动另一活动的时候,只需要把这些数据再从Intent中取出来。

    代码示例:

    发送示例:

    String data="Hello SecondActivity";

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

    //通过键值对的方式进行数据存储,前方是键,用于取出数据的时候使用,后面的参数为具体数值;

    intent.putExtra("extra_data",data);

    startActivity(intent);

    接受示例:

    Intent intent=getIntent();

    String data=intent.getStringExtra("extra_data");


    返回参数给上一个活动:

    启动Activity中

    startActivityForResult()方法接受两个参数,第一个参数还是Intent,第二个参数是请求码,用于相应后判断数据来源。

    Intent  intent=new Intent(MainActivity.this,SecondClass.class);

    startActivityForResult(intent,1);

    被启动的activity中,需要写入setResult(),该方法具有两个参数:第一个参数用于想上一个活动返回处理结果,一般只使用RESULT_OK或则RESULT_CANCELED这两个值,第二个参数为Intent-只用于传递数据

    Intent  intent=new Intent();

    intent.putEXtra("data","back_1");

    setReuslt(RESULT_OK,intent);

    finish();

    启动Activity中

    从写onActivityReuslt(),一共接受3个参数,第一个参数为requestCode请求码,在startActivityForResult();中的第二个参数,第二个resultCOde,即我们setResult()中返回数据结果。第三个为setResult()的第二个参数,也是返回的数据结果载体;

    一般在onActivityReuslt()中通过requestCode判断是哪个Activity返回的数据,然后通过resultCode判断值的来源判断处理结果是否成功,进行相应处理;

    相关文章

      网友评论

        本文标题:Activity的基本理解

        本文链接:https://www.haomeiwen.com/subject/qzeibttx.html