美文网首页
Chapter 02. Activity

Chapter 02. Activity

作者: GeekGray | 来源:发表于2018-10-12 20:34 被阅读5次

阅读原文

2.1 Activity理解

2.1.1组件的特点

  • 它的类必须实现特定接口或继承特定类

  • 需要在配置文件中配置其全类名 Androidmanifest.xml

  • 它的对象不是通过new来创建的, 而是系统自动创建的

  • 它的对象具有一定的生命周期, 它的类中有对应的生命周
    期回调方法

2.1.2 Actvity的定义

  • Activity, 直译为活动, 它是Android定义的四大
    应用组件之一,也是最重要用得最多的.

  • Activity用来提供一个能让用户操作并与之交
    互的界面

  • 一个应用有多个界面, 也就是包含多个Activity

  • 打电话,发短信, 拍照,发邮件等功能都是通过
    Activity来做的

  • Activity通过setContentView()方法来显示指定组件,该方法既可以接收View对象作为参数也可以接收布局文件对应的资源id作为参数。

2.1.3 Activity常用事件

  • onKeyDown(int keyCode,KeyEvent event):对应按键按下事件

  • onKeyUp(int keyCode,KeyEvent event):对应按键松开事件

  • onTouchEvent(MotionEvent event):对应点击屏幕事件


2.2 Intent和IntentFilter的理解

2.2.1Intent的理解

Intent, 直译为意图, 也就是你想要做什么或想要去哪?

  • Intent是Activity, Service和BroadcastReceiver这三个应用
    组件之间进行通信的信使
  • 例如: 我要在Activity中启动另一个Actvity, 就必须使用

2.2.2 Intent对象

  • 意图对象还可以携带数据

  • 注意: Intent不是Android中的四大应用组件之一

2.2.3 Intent的分类

显式意图 : 明确指定的目标组件的意图

  • 创建对象 : Intent(Context context, Class clazz)

  • 何时使用 : 当操作当前自己应用的组件时使用

  • 隐式意图 : 没有明确指定目标组件的意图

  • 创建对象 : Intent(String action)

  • 何时使用 : 当操作其它应用的组件时使用

2.2.4 IntentFilter的理解

在配置Activity时, 可以为Activity指定一个IntentFilter的配置

  • 如果你的Activity希望其它应用能访问到, 需要配置<intent-filter>

  • 如果你想启动其它应用的界面你必须用隐式intent, 且目标界面Activty配
    置了<intent-filter>

  • 它的作用类似于web中的为Servlet配置的<url-pattern>

image

2.3 相关API

2.3.1 Intent: 意图

Intent(Context packageContext, Class<?> cls) : 用于创建显示意图对象

Intent(String action): 用于创建隐式意图对象

putExtra(String name, Xxx value): 保存额外数据

Xxx getXxxExtra(String name): 获取额外数据

setData(Uri data): 设置有特定格式的uri数据

2.3.2 Activity: 活动

startActivity(Intent intent): 一般启动Activity

startActivityForResult(int reqCode, Intent intent): 带回调启动Activity

onActivityResult(int reqCode, int resultCode, Intent data): 回调方法

setResult(int resultCode, Intent data): 设置要返回的结果

finish(): 结束当前Activity

getIntent(): 得到启动Activity的意图

sendBroadcast(Intent intent): 发送广播

startService(intent): 启动服务

2.3.3 Activity生命周期相关方法

onCreate()
onStart()
onResume()
onPause()
onRestart()
onStop()
onDestory()

2.3.4 View: 代表视图的根基类

setOnClickListener(OnClickListener listener): 设置点击监听

setOnLongClickListener(OnLongListener listener): 设置长按监听

SmsManager: 发送短信的工具类

static SmsManager getDefault() : 得到当前对象

sendTextMessage(...): 发送短信

2.3.5 设置点击监听的3种方式

• 方式一: Activity中添加监听:
view.setOnClickListener(OnClickListener);
其中: OnClickListener是一个接口实现类的对象

• 方式二: view.setOnClickListener(this);
然后使得当前操作所在的Activity实现OnClickListener接口

• 方式三: 布局添加监听:
layout中: android:onclick=“方法名”
Activity中: public void 方法名(View v) { }

• 设置长按监听
• view.setOnLongClickListener(OnLongClickListener)


2.4 编写Activity的基本步骤

  1. 定义Activity类的子类HelloActivity
  2. 在AndroidManifest.xml配置定义的组件
  3. 定义布局文件activity_hello.xml
  4. 重写Activity的onCreate(), 加载布局文件

2.4.1 启动一个Activity

一般启动

startActivity(Intent intent)

• 带回调的启动

startActivityForResult(int reqCode, Intent intent)
onActivityResult(int reqCode, int resultCode, Intent data)

• 如何携带额外数据

intent.putExtra(name, value)

• 如何获取携带的额外数据

Xxx intent.getXxxExtra(name)

• 如何得到启动的intent

Intent getIntent()

2.4.2 结束一个Activity

一般结束

finish()

• 带结果的结束

setResult(int resultCode, Intent data)

finish()


2.5 Activity界面的四种状态

  • 运行状态: 可见也可操作

  • 暂停状态: 可见但不可操作

  • 停止状态: 不可见,但对象存在

  • 死亡状态: 对象不存在

2.5.2 Activity的生命周期回调方法

  • onCreate(): activity对象被创建时调用,常用语初始化操作。如:设置布局、
    初始化视图、绑定事件等

  • onStart(): 此时的activity还处于不可见状态,可见时执行

  • onResume(): 此时activity处于可见状态,且一定位于返回栈的栈顶,获取焦点

  • onPause(): 系统准备去启动或恢复另一个activity时调用, activity即将从可
    见变为不可见状态,释放一些cpu资源,失去焦点

  • onRestart(): 此时的activity被重新启动了

  • onStop(): activity处于完全不可见时调用,进入后台时执行

  • onDestory(): 被销毁前调用,之后activity变为销毁状态

image

2.5.3 Activity生命周期与状态

image

2.5.4 Activity从启动到关闭

Activity从启动到关闭时,会依次执行onCreate->onStart()->onResume()->onPause()->onStop()->onDestroy()方法。当Activity执行到onPause()方法失去焦点时,从新调用回到前台会执行onResume()方法。当执行到onStop()方法Activity不可见时,再次回到前台会执行onRestart()方法和onStart()方法,如果进程被杀死,Activity会重新执行onCreate()方法。

2.5.5 Activity存活

应用程序启动Activity01一次执行onCreate()->onStart()->onResume(),这个顺序是从第一Activity从创建到显示到前台到用户可点击的过程

当从Activity01跳转到Activity02的时候,Activity01首先会失去焦点执行onPause()方法,然后Activity02依次执行onCreat()->onStart()->onResume()方法从创建到前台可见,这时Activity01执行onStop()方法。

当Activity02点击返回键返回到Activity01时,Activity02先执行了onPause()方法,然后Activity01执行onRestart()->onStart()->onResume()方法,随后Activity02才彻底关闭,执行onStop->onDestroy()。在Activity01跳转到Activity02时,Activity01并没有执行finish()方法,而是执行了onStop()方法,因此从Activity02返回到Activity01时,Activity01执行了onRestart()方法。

当Activity失去焦点时,首先必然会执行onPause()方法,因此项目中需要保持数据时,可以在onPause方法中保存,同时,当两个Activity跳转时,Activity01会先失去焦点让Activity02得到焦点,等到Activity02完全显示在前台时Activity01才会切换到后台。


2.6 横竖屏切换时的生命周期

当手机横竖屏切换的时候,Activity会销毁重建,如果不希望在横竖屏切换时Activity被销毁重建,可以在AndroidManifest.xml文件中配置Activity的android:configChanges的属性,这样无论怎样切换Activity都不会销毁重新创建,具体代码如下

android:configChanges="orientation|keyboardHidden|screenSize"

如果希望某一个界面一直处于竖屏或横屏状态,不随手机的晃动而改变则可以在清单文件中通过设置Activity的参数来完成,具体代码如下

竖屏:android:screenOrientation="portrait"

横屏:android:screenOrientation="landscape"

2.7.1 Activity的TaskStack

在Android中,当一个应用启动时,Android就会为之创建一个任务栈,先启动的Activity压在栈低,后启动的Activity放在栈顶,通过启动模式可以控制Activity在任务栈中的加载情况。系统用Task Stack (Back Stack)结构来存储管理启动的
Activity对象

  • 一个应用启动,系统就会为其创建一个对应的Task Stack来存储并管理该
    应用的Activity对象

  • 只有最上面的任务栈的栈顶的Activity才能显示在窗口中

image image

2.7.2 Activity的4种launchMode

在Android中, 启动一个Activity有时需要创建一个新对象, 有时需要复用已
有的对象, 可以通过在配置activity时通过launchMode属性指定。launchMode属性值(4个)为:

standard: 标准模式

每次调用startActivity()方法就会产生一个新的实例。
这是默认的模式,系统不会判断该Activity在栈中是否存在,每次启动都会创建一个新的实例

singleTop:

当启动的Activity已经位于栈顶时,则直接使用它,不创建新的实例。如果启动的Activity没有位于栈顶时,则创建一个新的实例位于栈顶。

singleTask:

只有一个实例, 默认在当前Task中,每次启动Activity时,系统首先会检查栈中是否存在该Activity的实例,如果发现已经存在则直接使用该实例,并将当前的Activity之上的所有Activity出栈,如果没有发现则创建一个新的实例

singleInstance:

只有一个实例, 创建时会新建一个栈, 且此栈中不能有其它对象,无论从哪个任务栈中加载该Activity,只会创建一个实例,并且使用一个全新的任务栈来装载该Activity实例。采取这种模式启动Activity会分为两种情况:

  • 如果启动的Activity不存在,系统会先创建一个新的任务栈,再创建该Activity的实例,并把该Activity加入栈顶
  • 如果启动的Activity存在,无论位于哪个应用程序或者哪个任务栈中,系统都会把该Activity所在的任务栈转到前台,从而使Activity显示出来。

2.8 在Activity中使用Intent

Intent一般用于启动Activity、服务、发送广播,承担了Activity应用程序三大核心组件的相互通信功能。

2.8.1 Intent开启三个组件

方法声明 功能描述
Activity startActivity(Intent intent)

startActivityForResult(Intent intent)
Service ComponentName.startService(Intent intent)

boolean bindService(Intent service,ServiceConnection conn, int flag)
BroadcastReceiver sendBroadcast(Intent intent)

sendBroadcast(Intent intent , String receiverPermission)

sendOrderedBroadcast(Intent intent, String receiverPermission)

2.8.2 数据传递方式

在Activity01中储存了数据,要将该数据传递到Activity02中,如下代码

String data="Hash";
Intent intent=new Intent(this,Activity02.class);
intent.putExtra("data",data);
startActivity(intent);

putExtra()方法中第一个参数是key,第二个参数是value,若想在Activity02中接收数据则

Intent intent=getIntent();
String data=intent.getStringExtra("data");

2.8.3 Bundle对象传递数据

Activity01携带数据

Bundle bundle=new Bundle();
bundle.putString("name","Hash");
bundle.putInt("age",20);
Intent intent=new Intent(this,ACtivity02.class);
intent.putExtras(bundle);
startActivity(intent);

Activity02接收数据

Intent intent=getIntent();
Bundle bundle=intent.getExtras();
String stuName=bundle.getString("name");
int stuAge=bundle.getString("age");

2.9 回传数据

使用微博等社交软件时,在发布页面进入图库选择图片后,会回到微博发布页面并带回了图片选择页面的图片信息。由于这种需求十分常见,因此Android提供了一个startActivityForResult()方法。startActivityForResult()方法的第一个参数为Intent,第二个参数为请求码,用于判断数据来源

Activity01

Intent intent=new Intent(this,Activity02.class);
startActivityForResult(intent,1);

由于使用了startActivityForResult()方法启动Activity02,因此在Activity01页面需要重写回调onActivityResult()方法,来获取返回的数据

onActivityResult()方法第一个参数requestCode,表示启动Activity时传递的请求码;第二个参数resultCode表示在返回数据时传入的结果码;第三参数data表示携带返回数据的Intent。由于startActivityForResult()方法可能用于启动多个页面,而每一个页面的数据都会回传到onActivityResult()方法中,所以需要根据requestCode的值来判断数据来源于哪个Activity,再根据resultCode的值来判断数据处理结果

protected void onActivityResult(int requestCode,int resultCode,Intent data)
{
    super.onActivityResult(requestCode,resultCode,data);
    if(resultCode==1)
    {
        String data=data.getStringExtra("data");
    }

}

Activity02中

Intent intent=new Intent();
intent.putExtra("data","Hash");
setResult(1,intent);
finish();

setResult()方法第一个参数resultCode结果码一般使用0,1;第二个参数则是把带有数据的Intent传递回去,最后调用finish()方法销毁当前Activity

相关文章

网友评论

      本文标题:Chapter 02. Activity

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