Activity基础知识

2017-05-03  本文已影响0人  我爱吃青苹果

1.Activity的创建

Activity 是Android 四大组件之一,用于展示界面

1.自定义类继承Activity

新建一个Android 工程,在src 目录下新建一个类,不妨起名MyActivity,让该类继承Android SDK提供的Activity。

2.MyActivity 中覆写onCreate()方法

onCreate() 方法在当前Activity 被系统创建的时候调用
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是MyActivity的界面"/>
</LinearLayout>

3.AndroidManifest.xml 中进行Activity 的注册

Android 中共有四大组件,除了BroadCastReceiver 之外,其他三个组件如果要使用那么必须在AndroidManifest.xml 中进行注册(也叫声明)
activity/android:name:要注册的Activity 的全限定类名
activity/android:label:Activity 左上角显示的名称

intent-filter:叫意图过滤器,一般用于隐式启动该Activity
action/android:name:意图过滤器的Action 名称,可以自定义也可以使用系统提供的。
category/android:name:意图过滤器的category 名称,只能使用系统提供的常量值。

2.Activity的跳转

显式跳转:在可以引用到另外一个Activity 的字节码,或者包名和类名的时候,通过字节码,或者包名+类名的方法实现的跳转叫做显示跳转。
显示跳转多用于自己工程内部多个Activity 之间的跳转,因为在自己工程内部可以很方便地获取到另外一个Activity 的字节码。

隐式跳转:隐式跳转不需要引用到另外一个Activity 的字节码,或者包名+类名,只需要知道另外一个Activity 在AndroidManifest.xml 中配置的intent-filter 中的action 和category 即可。
言外之意,如果你想让你的Activity 可以被隐式意图的形式启动起来,那么就必须为该Activity 配置intent-filter。
//通过Intent 的带参构造函数
Intent intent = new Intent();
//通过Intent 的setClass 方法
intent.setClass(this, SecondActivity.class);
//Intent 可以携带的数据类型
1.八种基本数据类型boolean、byte、char、short、int、float、double、long 和String 以及这9 种数据类型的数组形式
2.实现了Serializable 接口的对象
3.实现了Android 的Parcelable 接口的对象以及其数组对象
//要跳转的activity在清单文件里增在intent-filter
<intent-filter >
        <action android:name="自己定义,习惯用包名后加功能名"/>
        <category android:name="android.intent.category.DEFAULT"/> //默认
</intent-filter>

//谁要跳转到这个activity,谁的方法里面调用
Intent intent = new Intent();
intent.setAction("要跳转的activity在清单文件里配置的action");
intent.addCategory("android.intent.category.DEFAULT");-->默认
startActivity(intent);
在清单文件的 intent-filter 里面还可以配置 data标签,data标签可以配置多个不同种类型的
例如:
<data android:scheme="自己定义"/> -->设置前缀,与电话播放器调用很像
<data android:mimeType="text/plain"/> -->定义类型,这里不能随意定义

在java代码里,如果同时配置了scheme和mineType:
intent.setDataAndType(scheme,mimeType);

如果只配置scheme:
intent.setData();

如果只配置了mimeType:
intent.setType();

3.示例代码

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread(){
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, CalcActivity.class);
                startActivity(intent);
                finish();//把mainActivity关闭
            }
        }.start();
    }
}
public class ResultActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);
        // 获取传递过来的Intent
        Intent intent = getIntent();
        // 取出对应的数据
        String name = intent.getStringExtra("name");
        Bitmap bitmap = intent.getParcelableExtra("bitmap");
    }
}

3.Activity 的生命周期

Activity 从创建到销毁,整个生命周期是一个非常复杂的过程,该过程由Android 系统负责维护

1.Activity 的3种状态

Resumed、Paused、Stopped可以理解为:激活或运行状态、暂停状态、停止状态

我们编写的代码要根据Activity 的不同状态让其做不同的工作。
如果我们的Activity 是用于播放视频的:
当其位于Resumed 状态时我们可以让视频正常的播放。
当Activity 位于Paused 状态的时候,我们也应该让我们的视频暂停播放。
当Activity 位于Stopped 状态时我们应该停止播放视频并释放资源。

2.Activity 生命周期的回调方法

OnCreate    
当Activity 第一次创建时被调用,在该方法中我们应该执行创建视图、初始化数据等工作。
该方法被调用之后紧接着就是调用onStart 方法。

onStart 
当Activity 对用户可见前被系统调用。

onResume    
当Activity 可以跟用户交互前被调用,该方法被调用后Activity 就处于Resumed 状态。

onPause 
当另外一个Activity 即将成为Resumed 状态前调用,在该方法中应该保存临时数据、停止动画、暂停视频播放器等。
必须要注意的就是该方法执行必须要快,因为只有当该方法执行过之后,另外一个Activity 才会成为Resumed 状态,不然会造成Activity 直接切换的“卡顿”现象。

onStop  
当Activity 对用户已经完全不可见的时候就会调用该方法。
当另外一个Activity 已经成为Resumed 状态或者当前Activity 被销毁的情况下会导致当前Activity 不可见。

onDestory   
当Activity 被销毁前调用。
当前Activity 调用finish()方法或者系统为了释放内存而将其销毁都会调用该方法。

onRestart   
当Activity 处于onStop 状态之后,如果重新启动则会调用该方法。
比如如果当前Activity位于Resumed 状态,此时我们按了Home 键,那么Activity 就完全不可见了,onStop 方法就会被执行,然后再长按Home 键再将该Activity 重新启动起来就会调用onRestart 方法。

3.横竖屏切换时Activity 的生命周期

Android 手机在横竖屏切换时,默认情况下会把Activity 先销毁再创建。

在类似手机游戏、手机影音这一类的应用中,这个体验是非常差的。不让Activity 在横竖屏切换时销毁,只需要在清单文件声明Activity 时配置<activity>节点的几个属性即可,其方式如下:

//参数配置到Activity,就不会再销毁和重新创建了
android:configChanges="orientation|keyboardHidden|screenSize"

//固定Activity 的方向
//有两种方法:
    //通过配置文件
    在AndroidManifest.xml 中的activity 节点中添加如下属性。
    android:screenOrientation="portrait"
    该属性通常有两个常量值,portrait:垂直方向,landscape:水平方向。
    
    //通过代码
    在Activity 的onCreate 方法中执行如下方法。
    //垂直方向
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    //水平方向
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

4.Activity 的启动模式

1.Activity 的任务栈

Task Stack(任务栈)是一个具有栈结构的容器,可以放置多个Activity 实例

2.优缺点

3.启动模式

Activity 的启动模式
启动模式(launchMode)在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity 实例,是否重用已存在的Activity 实例,是否和其他Activity 实例共用一个task。

Activity 一共有以下四种启动模式:standard、singleTop、singleTask、singleInstance。

我们可以在AndroidManifest.xml配置<activity>的android:launchMode属性为以上四种之一即可。

Activity的启动模式是很重要的一个知识点,在项目开发中经常会用到启动模式来帮助我们解决一些比较难解决的bug,也可以帮助我们去优化一个项目的任务栈,防止界面太多导致卡顿和OOM。
上一篇 下一篇

猜你喜欢

热点阅读