学学笔记,Activity的主导清楚

时间:2019-09-18 15:50来源: 操作系统
Activity:是Android的四大组件之一,主要处理界面的显示相关。 第 2 章 先从看得到的入手,探究活动 来自: 一:在活动中使用 Menu ( 创建菜单布局 )在 res 目录下新建一个 menu 文件夹

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

第 2 章 先从看得到的入手,探究活动

永利皇宫463娱乐网址 1来自:

一:在活动中使用 Menu

  • 创建菜单布局)在 res 目录下新建一个 menu 文件夹,右击 menu文件夹→New→Android XML File
  • xml文件内容为
<menu xmlns:android="http://schemas.android.com/apk/res/android" >//**有别于其他布局,这里是menu**
    <item       //** 这里是item **
        android:id="@+id/add_item"
        android:title="Add"/>
    <item
        android:id="@+id/remove_item"
        android:title="Remove"/>
</menu>
  • oncreate载入布局)在代码中重写 onCreateOptionsMenu()方法(通过 getMenuInflater方法能够得到 MenuInflater对象,再调用它的 inflate方法就可以给当前活动创建菜单了。)
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
  • 菜单点击事件)在代码中重写 onOptionsItemSelected()方法
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.add_item:
    Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
    break;
    case R.id.remove_item:
    Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
    break;
    default:
    }
    return true;
}

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

二:Intent

  1. 显示Intent (略)
  2. 隐式Intent (广播、服务都有用到
  • 通过在标签下配置内容,可以指定当前活动能够响应的action和category(只有同时能够匹配上Intent中指定的action和category时,这个活动才能响应该 Intent)
  • 调用时:
        Intent intent = new Intent("com.example.activitytest.ACTION_START");
        startActivity(intent);
  • :每个 Intent中只能指定一个 action,但却能指定多个 category。
    调用时添加:
    intent.addCategory("com.example.activitytest.MY_CATEGORY");
  1. 更多隐式 Intent 的用法(调用系统的浏览器来打开这个网页)
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("http://www.baidu.com"));
    startActivity(intent);
  • :我们还可以在<intent-filter>标签中再配置一个<data>标签,用于更精确地指定当前活动能够响应什么类型的数据。<data>标签中主要可以配置以下内容。
    1. android:scheme
    2. android:host
    3. android:port
    4. android:path
    5. android:mimeType

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

三:返回数据给上层activity

  • 界面1:startActivityForResult(intent, 1);
  • 界面2:退出时
    intent.putExtra("data_return", "Hello FirstActivity");
    setResult(RESULT_OK, intent);
  • :要重写onBackPressed方法,否则返回键就不会返回数据
  • 界面1:重写onActivityResult方法,提取数据。
if (resultCode == RESULT_OK)    String returnedData = data.getStringExtra("data_return");

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

四: DialogActivity (将普通activity变为DialogActivity)##

  • 修改该Activity的清单文件为:
<activity android:name=".DialogActivity" android:theme="@android:style/Theme.Dialog" >
  • 注:如果修改该DialogActivity的布局就可以自定义对话框了

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

五:使用savedInstanceState保存数据

  • 重写onSaveInstanceState方法
String tempData = "Something you just typed";
outState.putString("data_key", tempData);
  • 在oncerate方法中取出数据
if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("data_key");
Log.d(TAG, tempData);
}

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

六:活动的启动模式(可以在AndroidManifest.xml中通过给标签指定android:launchMode属性来选择启动模式)##

  • standard:每次启动创建一个实例(系统默认)
  • singleTop:当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例
  • singleTask:只能存在一个实例。除非销毁,否则不新建(可用于防止连续点击时重复创建实例
  • singleInstance:在单独一个返回栈中管理活动,不管哪个应用访问该活动,都共用一个返回栈

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

七:一次销毁多个活动

  • 新建ActivityCollector类来管理所有Activity
public class ActivityCollector {
    public static List activities = new ArrayList();
        public static void addActivity(Activity activity) {
        activities.add(activity);
    }

    public static void removeActivity(Activity activity) {
        activities.remove(activity);
    }

    public static void finishAll() {
        for (Activity activity : activities) {
            if (!activity.isFinishing()) {
            activity.finish();
            }
        }
    }
}
  • 修改 BaseActivity中的代码,
    在onceate方法中调用addactivity
    在ondestory方法调用removeActivity

  • 在需要finish所有activity时只要调用ActivityCollector.finishAll();即可。

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

八:启动活动的最佳写法(防止调用时遗漏参数)

  • 在activity中新建如下方法
    public static void actionStart(Context context, String data1, String data2) {
    Intent intent = new Intent(context, SecondActivity.class);
    intent.putExtra("param1", data1);
    intent.putExtra("param2", data2);
    context.startActivity(intent);
    }
  • 调用时:SecondActivity.actionStart(FirstActivity.this, "data1", "data2");

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

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

第二条 onPause()——onResume()

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

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

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

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

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

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

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

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

Activity的启动模式:详细见网址:

首先是启动模式的设置:可以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的沉浸模式:

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

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

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

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

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

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

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

startActivity;

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

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

不明确指出我们要启动哪一个活动,而是指定了一系列更为抽象的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;

//接受隐式意图的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(""));

startActivity;

关于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-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中取出来。

永利皇宫463娱乐网址,代码示例:

发送示例:

String data="Hello SecondActivity";

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

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

intent.putExtra("extra_data",data);

startActivity;

接受示例:

Intent intent=getIntent();

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

返回参数给上一个活动:

启动Activity中

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

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

startActivityForResult;

被启动的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的主导清楚

关键词: