美文网首页
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