天天看点

Android开发之Activity初识认识ActivityActivity的构成如何创建使用Activity启动 & 关闭Activity启动其他Activity并返回结果Activity启动的方式Activity的状态保存Activity设置成窗口样式安全退出调用多个Activity的ApplicationActivity横竖屏切换如何修改Activity进入和退出的动画

Android开发之Activity初识

  • 认识Activity
  • Activity的构成
  • 如何创建使用Activity
    • 1.创建Activity
    • 2.清单文件配置
  • 启动 & 关闭Activity
  • 启动其他Activity并返回结果
  • Activity启动的方式
    • 1.直接启动
    • 2.匿名启动
  • Activity的状态保存
  • Activity设置成窗口样式
  • 安全退出调用多个Activity的Application
  • Activity横竖屏切换
  • 如何修改Activity进入和退出的动画

认识Activity

        活动Activity的介绍在Android界已经属于老生常谈了,基本上每个Android开发人员对Android四大组件都有着深刻的印象和自己或多或少的认知。Activity间接或直接地继承了Context、ContextWrapper、ContextThemeWrapper等基类,因此Activity可以直接调用它们的方法。

        Android的四大组件分别是Activity(活动)、Service(服务)、BroadcastReceiver(广播)和Content Provider(内容提供者)。无论是对Android开发者还是对用户来说,Activity一定是我们使用最频繁,最基础,也是关系最密切的组件。那么Activity是什么呢?

        Activity是Android的四大组件之一,是活动,是应用中担任着展示界面和与用户进行交互的一个角色。Activity会加载指定的布局文件来显示各种UI元素,并且为这些UI元素设置事件处理函数,使得用户可以与这些UI进行交互。

        Activity还可以在不同的Activity之间跳转,将不同的页面串联在一起,共同完成特定的操作流程。每个应用都是由一个或者多个Activity组成,它是Android应用程序中不可缺少的一部分。

Activity的构成

        Activity视图会被设置给一个Window类,这个Window中含有一个DecorView,DecorView是整个窗口的顶级视图。

        开发人员设置的布局会被设置到DecorView的mContentParent布局中。Android中实际内置了一些系统布局文件XML,我们在XML中定义的视图最终会被放置到这些系统布局的特定节点之下,这样就形成了整个DecorView。

        Activity之下有一个PhoneWindow,这个PhonWindow是Window的实现类,然后Window之下包含一个DecorView,DecorView实际上是页面的顶级视图,它从一些系统布局中加载,并且在运行时将开发人员设置给Activity的布局资源添加到系统布局的mContentParent中。

如何创建使用Activity

1.创建Activity

        创建Activity首先我们要创建一个类(class),这个类需要继承Android的Activity类或者其子类;

public class MainActivity extends AppCompatActivity
           

        然后我们要重写它的onCreate方法,在onCreate()方法中我们给它设置显示的UI布局,通过setContentView()方法,这样一个Activity就创建出来了。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
           

        在使用这个Activity之前我们需要去清单文件AndroidManifest.xml文件中为这个Activity注册,如果一个Activity没有在清单文件注册直接运行会导致App Crash。

2.清单文件配置

        在AndroidManifest.xml中我们要创建个标签,这个标签中有个android:name,name是当前activity的标识。这个标识的组成前半部分是该activity的包,后半部分是这个activity的名字。所以这个name是该activity的包和名字组成的。

<activity android:name="com.ms.awe.studydemo.MainActivity">
           

        当Activity是主入口的Activity,那么我们需要给这个activity在AndroidManifest中设置action和category。

这样设置之后该activity就成为了应用程序的主入口了。

<intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
           

启动 & 关闭Activity

        启动Activity可以通过startActivity(Intent intent)、startActivityForResult(Intent intent,int requestCode)方法实现;

//启动其他Activity
startActivity(Intent intent);
//以指定的请求码启动Activity,而且程序将会获取新启动的Activity返回的结果
startActivityForResult(Intent intent,int requestCode);
           

        关闭当前Activity只需按下Back键或者调用方法finish()即可;

finish()
           

启动其他Activity并返回结果

        startActivityForResult(Intent intent,int requestCode)方法启动指定Activity,期望获取指定Activity返回的结果。为了获取被启动的Activity所返回的结果;

        1.当前Activity需要重写onActivityResult(int requestCode,int rusultCode,Intent intent);当被启动的Activity返回结果时,该方法将会被触发,其中requestCode代表请求码,resultCode代表Activity返回的结果码,这个结果码也是由开发者根据业务自行设定的。

        2.被启动的Activity需要调用setResult()方法设置处理结果;

Activity启动的方式

1.直接启动

        我们在项目当中去启动我们自己的Activity,一般都是通过直接启动的方式去启动,根据Activity名字就可以拿到我们要启动的Activity,这种方式也叫做Activity的显式启动;

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

        通过一个Intent显式去指定一个类的名字去启动一个Activity,显式启动还有另外一种方式;

Intent intent = new Intent();
ComponentName component = new ComponentName(MainActivity.this,MsActivity.class);
intent.setComponent(component);
startActivity(intent);
           

2.匿名启动

        假如我们要启动某个应用的某个界面activity,这个时候我们不知道这个activity的具体名字,这个时候我们只能通过action去启动Activity。这两种方式使用的场景不同。

        Category属性用于指定当前动作(Action)被执行的环境;

<activity android:name=".MsActivity">
    <intent-filter>
        <action android:name="www.Musijun.com">
        <category android:name="android.intent.category.DEFAULT"
    </intent-filter>
</activity>
           

        配置隐式Intent最关键的是在AndroidManifest清单文件中去根据action的名字配置相同一个category,category默认情况下用DEFAULT这种category,action可以配多个也可以配一个。

Intent intent = new Intent();
intent.setAction("www.Musijun.com");
startActivity(intent);
           

Activity的状态保存

        在Activity可能被回收之前调用onSavedInstanceState()方法来保存自己的状态和信息以便被系统回收重建的时候恢复数据;

        系统会灵活决定调不调用onSavedInstanceState()方法,如果要调用就一定在onStop()方法之前调用,不能保证是发生在onPause()方法之前还是之后;

        数据恢复可以在onCreate()或onRestoreInstanceState()方法中进行;

        onRestoreInstanceState()方法在onStart()和onPostCreate()方法之间调用,在onCreate()方法中也可以恢复状态,但有时候需要所有布局初始化完成后再恢复状态。

//状态保存
onSavedInstanceState(Bundle);
//状态恢复
onCreate(Bundle);
onRestoreInstanceState();
           

Activity设置成窗口样式

        如果想将Activity样式设置成Dialog样式的,需要在清单文件AndroidManifest.xml文件中将Activity标签下的theme属性设置成Theme.Dialog即可。

android:theme="@android:style/Theme.Dialog"
           

安全退出调用多个Activity的Application

        如果一个Application中已经开启了多个Activity,此时我们想在当前Activity中安全关闭Application中已经开启的所有Activity,我们有如下方案可供选择:

        1.可以记录打开的Activity,每打开一个Activity就记录下来在需要退出的时候关闭每一个Activity;

        2.发送特定广播,在需要结束应用时发送一个特定的广播,每个Activity接收到广播后关闭即可;

        3.递归退出,在打开新的Activity使用startActivityForResult(),然后自己添加标志,在onActivityResult()中处理递归关闭;

        4.通过intent的flag实现intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一个新的Activity,此时如果该Back Stack中已经有该Activity,那么系统会把这个Activity上面的所有Activity清理掉;

Activity横竖屏切换

        Activity横竖屏切换时候的生命周期是跟清单文件的配置相关;

        1.不做任何设置的情况下Activity进行横竖屏切换会重新调用各个生命周期,默认首先销毁当前Activity然后再重新加载;

        2.设置Activity的android:configChanges="orientation"时切屏还是会重新调用各个生命周期,切横、竖屏都只会执行一次;

        3.设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"的时候切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。切记要加上screenSize,否则4.0以上版本不生效;

如何修改Activity进入和退出的动画

        1.通过定义Activity的主题,在style.xml中编码,在AndroidManifest.xml中给指定的Activity指定theme;

<style name="AnimationActivity" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_left</item> 
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item> 
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_right</item> 
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item> 
</style>

<style name="ThemeActivity"> 
    <item name="android:windowAnimationStyle">@style/AnimationActivity</item> 
    <item name="android:windowNoTitle">true</item> 
</style>
           

        2.第二种方法是通过重写Activity的overridePendingTransition方法;

overridePendingTransition(R.anim.fade, R.anim.hold);