Android基础-Activity基本使用

1. Activity概念

Activity,即活动,是一种可以包含用户界面的组件,主要用于和用户进行交互

活动提供应用程序绘制其UI的窗口。此窗口通常填充屏幕,但可能小于屏幕并浮动在其他窗口的顶部。通常,一个活动在应用程序中实现一个屏幕

多数应用包含多个屏幕,即多个活动,一般会指定一个活动为主要活动,即用户启动程序显示的第一个屏幕

2. Activity基本用法

2.1 注册声明

所有的活动都要在AndroidManifest.xml中进行注册才能生效活动的注册声明要放在<application>标签内,在<activity>标签中是用了android:name来指定具体注册哪一个活动。

**配置主活动的方法**就是在<application>标签内加入<intent-filter>标签。这个标签内包含和两个可选标签、。这些标签元素组合在一起以指定您的活动可以响应的意图类型。

示例:

<span style="color:#000000"><code class="language-xml"><span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>activity</span> <span style="color:#d19a66">android:name</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>.ExampleActivity<span style="color:#999999">"</span></span> <span style="color:#d19a66">android:icon</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>@drawable/app_icon<span style="color:#999999">"</span></span><span style="color:#999999">></span></span>
    <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>intent-filter</span><span style="color:#999999">></span></span>
        <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>action</span> <span style="color:#d19a66">android:name</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>android.intent.action.SEND<span style="color:#999999">"</span></span> <span style="color:#999999">/></span></span>
        <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>category</span> <span style="color:#d19a66">android:name</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>android.intent.category.DEFAULT<span style="color:#999999">"</span></span> <span style="color:#999999">/></span></span>
        <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>data</span> <span style="color:#d19a66">android:mimeType</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>text/plain<span style="color:#999999">"</span></span> <span style="color:#999999">/></span></span>
    <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>intent-filter</span><span style="color:#999999">></span></span>
<span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>activity</span><span style="color:#999999">></span></span>
</code></span>
  •  

如果时配置成主活动的话,为:

<span style="color:#000000"><code class="language-xml"><span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>action</span> <span style="color:#d19a66">android:name</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>android.intent.action.MAIN<span style="color:#999999">"</span></span> <span style="color:#999999">/></span></span>

<span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>category</span> <span style="color:#d19a66">android:name</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>android.intent.category.LAUNCHER<span style="color:#999999">"</span></span> <span style="color:#999999">/></span></span>
</code></span>
  •  

2.2 权限声明

除非两个活动在其清单中具有相同的权限,否则父活动无法启动子活动。如果为父活动声明uses-permission元素,则每个子活动必须具有匹配的uses-permission元素。

示例:

<span style="color:#000000"><code class="language-xml"><span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>manifest</span><span style="color:#999999">></span></span>
<span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>activity</span> <span style="color:#d19a66">android:name</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>....<span style="color:#999999">"</span></span>
   <span style="color:#d19a66">android:permission</span><span style="color:#669900"><span style="color:#999999">=</span>”com.google.socialapp.permission.SHARE_POST”</span>

<span style="color:#999999">/></span></span>
</code></span>
  •  

如果父活动声明了该权限,则子活动也必须声明该权限,否则父活动无法启动子活动。

2.3 销毁一个活动

销毁一个活动只需要按back键即可。Activity类提供了一个finish()方法,活动调用这个方法就可销毁当前活动。

2.4 Intent使用

Intent是Android程序中各组件之间进行交互的一种重要方式,不仅可以指明当前组件想要执行的动作,还可以在不同组件之间进行传递数据。被用于启动活动,启动服务以及发送广播等场景

2.4.1 使用显式Intent

Activity类中提供一个startActivity()方法,专门用于启动活动。

显示启动的三种方法:

  • 基本用法

    <span style="color:#000000"><code class="language-java">Intent intent <span style="color:#669900">=</span> <span style="color:#c678dd">new</span> Intent<span style="color:#999999">(</span>FirstActivity<span style="color:#999999">.</span><span style="color:#c678dd">this</span><span style="color:#999999">,</span> SecondActivity<span style="color:#999999">.</span><span style="color:#c678dd">class</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
                    <span style="color:#61aeee">startActivity</span><span style="color:#999999">(</span>intent<span style="color:#999999">)</span><span style="color:#999999">;</span>
    </code></span>
    •  
  • 通过Intent的ComponentName启动

    <span style="color:#000000"><code class="language-java">ComponentName cn <span style="color:#669900">=</span> <span style="color:#c678dd">new</span> ComponentName<span style="color:#999999">(</span><span style="color:#669900">"com.baiheng.activitytest"</span><span style="color:#999999">,</span><span style="color:#669900">"com.baiheng.activitytest.ThirdActivity"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    Intent intent <span style="color:#669900">=</span> <span style="color:#c678dd">new</span> Intent<span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    intent<span style="color:#999999">.</span><span style="color:#61aeee">setComponent</span><span style="color:#999999">(</span>cn<span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#61aeee">startActivity</span><span style="color:#999999">(</span>intent<span style="color:#999999">)</span><span style="color:#999999">;</span>
    </code></span>
    •  
  • 通过初始化Intent时指定包名

    <span style="color:#000000"><code class="language-java">Intent intent <span style="color:#669900">=</span> <span style="color:#c678dd">new</span> Intent<span style="color:#999999">(</span><span style="color:#669900">"android.intent.action.MAIN"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    intent<span style="color:#999999">.</span><span style="color:#61aeee">setClassName</span><span style="color:#999999">(</span><span style="color:#669900">"com.baiheng.activitytest"</span><span style="color:#999999">,</span> <span style="color:#669900">"com.baiheng.activitytest.ThirdActivity"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#61aeee">startActivity</span><span style="color:#999999">(</span>intent<span style="color:#999999">)</span><span style="color:#999999">;</span>
    </code></span>
    •  

2.4.2 使用隐式Intent

不明确指出我们想要启动哪一个活动,指定一系列抽象的action和category等信息,交由系统分析这个Intent,这个通过Intent的Intent-filter是实现。

<span style="color:#000000"><code class="language-xml"><span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>activity</span> <span style="color:#d19a66">android:name</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>.SecondActivity<span style="color:#999999">"</span></span><span style="color:#999999">></span></span>
            <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>intent-filter</span><span style="color:#999999">></span></span>
                <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>action</span> <span style="color:#d19a66">android:name</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>com.baiheng.activitytest.action.START<span style="color:#999999">"</span></span> <span style="color:#999999">/></span></span>
                <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>category</span> <span style="color:#d19a66">android:name</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>android.intent.category.DEFAULT<span style="color:#999999">"</span></span> <span style="color:#999999">/></span></span>
            <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>intent-filter</span><span style="color:#999999">></span></span>
        <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>activity</span><span style="color:#999999">></span></span>
</code></span>
  •  
<span style="color:#000000"><code class="language-java">Intent intent <span style="color:#669900">=</span> <span style="color:#c678dd">new</span> Intent<span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
intent<span style="color:#999999">.</span><span style="color:#61aeee">setAction</span><span style="color:#999999">(</span>Intent<span style="color:#999999">.</span>ACTION_START<span style="color:#999999">)</span><span style="color:#999999">;</span>     intent<span style="color:#999999">.</span><span style="color:#61aeee">addCategory</span><span style="color:#999999">(</span>Intent<span style="color:#999999">.</span>CATEGORY_DEFAULT<span style="color:#999999">)</span><span style="color:#999999">;</span>
                <span style="color:#61aeee">startActivity</span><span style="color:#999999">(</span>intent<span style="color:#999999">)</span><span style="color:#999999">;</span>
</code></span>
  •  

每个Intent只能指定一个action,但是却能指定多个category

<intent-filter>标签中再配置一个<data>标签,用于更精准地指定当前活动能够响应什么类型的数据。<data>标签中主要可以配置一下内容:

  • android:scheme:用于指定数据的协议部分,如示例:http
  • android:host:用于指定数据的主机名部分,如示例www.baidu.com
  • android:port:用于指定数据的端口部分,一般紧随在主机名之后
  • android:path:用于指定主机名和端口之后的部分,如一段网址跟在主机名之后的内容
  • android:mimeType:用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

只有<data>标签中指定的内容和Intent中携带的Data完全一致,当前活动才能够相应该Intent。一般不会在<data>标签中指定过多内容

2.4.3 使用隐式Intent启动其他程序

使用隐式Intent不仅可以启动程序内的活动,还可以启动其他程序的活动

示例:

<span style="color:#000000"><code class="language-java">Intent intent <span style="color:#669900">=</span> <span style="color:#c678dd">new</span> Intent<span style="color:#999999">(</span>Intent<span style="color:#999999">.</span>ACTION_VIEW<span style="color:#999999">)</span><span style="color:#999999">;</span>
                intent<span style="color:#999999">.</span><span style="color:#61aeee">setData</span><span style="color:#999999">(</span>Uri<span style="color:#999999">.</span><span style="color:#61aeee">parse</span><span style="color:#999999">(</span><span style="color:#669900">"http://www.google.com.hk"</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
                <span style="color:#61aeee">startActivity</span><span style="color:#999999">(</span>intent<span style="color:#999999">)</span><span style="color:#999999">;</span>
</code></span>
  •  

Uri.parse将一个网址字符串解析成一个Uri对象。

<span style="color:#000000"><code class="language-xml"><span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>activity</span> <span style="color:#d19a66">android:name</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>.ThirdActivity<span style="color:#999999">"</span></span><span style="color:#999999">></span></span>
            <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>intent-filter</span> <span style="color:#d19a66">tools:ignore</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>AppLinkUrlError<span style="color:#999999">"</span></span><span style="color:#999999">></span></span>
                <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>action</span> <span style="color:#d19a66">android:name</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>android.intent.action.VIEW<span style="color:#999999">"</span></span> <span style="color:#999999">/></span></span>
                <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>category</span> <span style="color:#d19a66">android:name</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>android.intent.category.DEFAULT<span style="color:#999999">"</span></span> <span style="color:#999999">/></span></span>
                <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>data</span> <span style="color:#d19a66">android:scheme</span><span style="color:#669900"><span style="color:#999999">=</span><span style="color:#999999">"</span>http<span style="color:#999999">"</span></span> <span style="color:#999999">/></span></span>
            <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>intent-filter</span><span style="color:#999999">></span></span>
        <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>activity</span><span style="color:#999999">></span></span>
</code></span>
  •  

3. Activity 间数据传递

一个App一般包含多个Activity,涉及到Activity之间的数据传递。关于如何传递不同的数据类型在Intent部分详解,这里介绍一下两种传递方式

3.1 向下传递数据

Intent中提供了一些列putExtra()方法的重载,可以把想要传递的数据暂存在Intent中,启动了另一个活动后,把这些数据从Intent中取出来就可以。

示例:在FirstActivity中:

<span style="color:#000000"><code class="language-java">String data <span style="color:#669900">=</span> <span style="color:#669900">"Hello SecondActivity"</span><span style="color:#999999">;</span>
                Intent intent <span style="color:#669900">=</span> <span style="color:#c678dd">new</span> Intent<span style="color:#999999">(</span>FirstActivity<span style="color:#999999">.</span><span style="color:#c678dd">this</span><span style="color:#999999">,</span> SecondActivity<span style="color:#999999">.</span><span style="color:#c678dd">class</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
                intent<span style="color:#999999">.</span><span style="color:#61aeee">putExtra</span><span style="color:#999999">(</span><span style="color:#669900">"extra_data"</span><span style="color:#999999">,</span> data<span style="color:#999999">)</span><span style="color:#999999">;</span>
                <span style="color:#61aeee">startActivity</span><span style="color:#999999">(</span>intent<span style="color:#999999">)</span><span style="color:#999999">;</span>
</code></span>
  •  

SecondActivity:

<span style="color:#000000"><code class="language-java"><span style="color:#999999">@Override</span>
    <span style="color:#c678dd">protected</span> <span style="color:#c678dd">void</span> <span style="color:#61aeee">onCreate</span><span style="color:#999999">(</span>Bundle savedInstanceState<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        <span style="color:#c678dd">super</span><span style="color:#999999">.</span><span style="color:#61aeee">onCreate</span><span style="color:#999999">(</span>savedInstanceState<span style="color:#999999">)</span><span style="color:#999999">;</span>
        <span style="color:#61aeee">setContentView</span><span style="color:#999999">(</span>R<span style="color:#999999">.</span>layout<span style="color:#999999">.</span>second_activity<span style="color:#999999">)</span><span style="color:#999999">;</span>
        Intent intent <span style="color:#669900">=</span> <span style="color:#61aeee">getIntent</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        String data <span style="color:#669900">=</span> intent<span style="color:#999999">.</span><span style="color:#61aeee">getStringExtra</span><span style="color:#999999">(</span><span style="color:#669900">"extra_data"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        Log<span style="color:#999999">.</span><span style="color:#61aeee">d</span><span style="color:#999999">(</span><span style="color:#669900">"SecondActivity"</span><span style="color:#999999">,</span> data<span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
</code></span>
  •  

3.2 返回数据给上一个活动

Activity中还有一个startActivityForResult()方法也适用于启动活动,但是该方法期望活动销毁的时候返回一个结果给上一个活动。

该方法接收两个参数,一个是Intent,第二个参数是请求码,用于之后在回调中判断数据的来源。

FirstActivity:

<span style="color:#000000"><code class="language-java">Intent intent <span style="color:#669900">=</span> <span style="color:#c678dd">new</span> Intent<span style="color:#999999">(</span>FirstActivity<span style="color:#999999">.</span><span style="color:#c678dd">this</span><span style="color:#999999">,</span> SecondActivity<span style="color:#999999">.</span><span style="color:#c678dd">class</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
                <span style="color:#61aeee">startActivityForResult</span><span style="color:#999999">(</span>intent<span style="color:#999999">,</span><span style="color:#98c379">1</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
</code></span>
  •  

SecondActivity:

<span style="color:#000000"><code class="language-java"><span style="color:#999999">@Override</span>
    <span style="color:#c678dd">protected</span> <span style="color:#c678dd">void</span> <span style="color:#61aeee">onCreate</span><span style="color:#999999">(</span>Bundle savedInstanceState<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        <span style="color:#c678dd">super</span><span style="color:#999999">.</span><span style="color:#61aeee">onCreate</span><span style="color:#999999">(</span>savedInstanceState<span style="color:#999999">)</span><span style="color:#999999">;</span>
        <span style="color:#61aeee">setContentView</span><span style="color:#999999">(</span>R<span style="color:#999999">.</span>layout<span style="color:#999999">.</span>second_activity<span style="color:#999999">)</span><span style="color:#999999">;</span>
        Button button2 <span style="color:#669900">=</span> <span style="color:#999999">(</span>Button<span style="color:#999999">)</span> <span style="color:#61aeee">findViewById</span><span style="color:#999999">(</span>R<span style="color:#999999">.</span>id<span style="color:#999999">.</span>button_2<span style="color:#999999">)</span><span style="color:#999999">;</span>
        button2<span style="color:#999999">.</span><span style="color:#61aeee">setOnClickListener</span><span style="color:#999999">(</span><span style="color:#c678dd">new</span> View<span style="color:#999999">.</span>OnClickListener<span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>

            <span style="color:#999999">@Override</span>
            <span style="color:#c678dd">public</span> <span style="color:#c678dd">void</span> <span style="color:#61aeee">onClick</span><span style="color:#999999">(</span>View v<span style="color:#999999">)</span> <span style="color:#999999">{</span>
                Intent intent <span style="color:#669900">=</span> <span style="color:#c678dd">new</span> Intent<span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
                intent<span style="color:#999999">.</span><span style="color:#61aeee">putExtra</span><span style="color:#999999">(</span><span style="color:#669900">"data_return"</span><span style="color:#999999">,</span><span style="color:#669900">"Hello FirstActivity"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
                <span style="color:#61aeee">setResult</span><span style="color:#999999">(</span>RRSULT_OK<span style="color:#999999">,</span> intent<span style="color:#999999">)</span><span style="color:#999999">;</span>
                <span style="color:#61aeee">finish</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
            <span style="color:#999999">}</span>
        <span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
</code></span>
  •  

最后在FirstActivity中重写这个方法得到返回数据:

<span style="color:#000000"><code class="language-java"><span style="color:#999999">@Override</span>
    <span style="color:#c678dd">protected</span> <span style="color:#c678dd">void</span> <span style="color:#61aeee">onActivityResult</span><span style="color:#999999">(</span><span style="color:#c678dd">int</span> requestCode<span style="color:#999999">,</span> <span style="color:#c678dd">int</span> resultCode<span style="color:#999999">,</span> <span style="color:#999999">@Nullable</span> Intent data<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        <span style="color:#c678dd">switch</span><span style="color:#999999">(</span>requestCode<span style="color:#999999">)</span> <span style="color:#999999">{</span>
            <span style="color:#c678dd">case</span> <span style="color:#98c379">1</span><span style="color:#669900">:</span>
                <span style="color:#c678dd">if</span> <span style="color:#999999">(</span>resultCode <span style="color:#669900">==</span> RESULT_OK<span style="color:#999999">)</span> <span style="color:#999999">{</span>
                    String returnedData <span style="color:#669900">=</span> data<span style="color:#999999">.</span><span style="color:#61aeee">getStringExtra</span><span style="color:#999999">(</span><span style="color:#669900">"data_return"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
                    Log<span style="color:#999999">.</span><span style="color:#61aeee">d</span><span style="color:#999999">(</span><span style="color:#669900">"FritstActivity"</span><span style="color:#999999">,</span>returnedData<span style="color:#999999">)</span><span style="color:#999999">;</span>
                <span style="color:#999999">}</span>
                <span style="color:#c678dd">break</span><span style="color:#999999">;</span>
            <span style="color:#c678dd">default</span><span style="color:#669900">:</span>
        <span style="color:#999999">}</span>
    <span style="color:#999999">}</span>
</code></span>
  •  

如果是通过back键返回,则可以通过在SecondActivity中重写onBackPressed()来解决:

<span style="color:#000000"><code class="language-java"><span style="color:#999999">@Override</span>
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">void</span> <span style="color:#61aeee">onBackPressed</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>
        Intent intent <span style="color:#669900">=</span> <span style="color:#c678dd">new</span> Intent<span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        intent<span style="color:#999999">.</span><span style="color:#61aeee">putExtra</span><span style="color:#999999">(</span><span style="color:#669900">"data_return"</span><span style="color:#999999">,</span><span style="color:#669900">"Hello FirstActivity"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        <span style="color:#61aeee">setResult</span><span style="color:#999999">(</span>RESULT_OK<span style="color:#999999">,</span> intent<span style="color:#999999">)</span><span style="color:#999999">;</span>
        <span style="color:#61aeee">finish</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
</code></span>
  •  

4. Activity生命周期

4.1 返回栈

Android中的活动是可以层叠的。每启动一个新的活动,就会覆盖原来的活动之上,点击Back键就会销毁最上面的活动。

Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也称作返回栈(Back Stack)。系统总是会显示处于栈顶活动给用户。

4.2 活动状态

每个活动在其生命周期中最多可能会有4中状态:

  • 运行状态

    活动位于返回栈的栈顶时,这时活动就处于运行状态。

  • 暂停状态

    活动不处于栈顶时,但是仍然可见,活动就进入暂停状态。

  • 停止状态

    活动不处于栈顶位置,且完全不可见,就进入停止状态。处于停止状态的活动有可能会被系统回收

  • 销毁状态

    活动从返回栈中移除后就变成了销毁状态。

4.3 生命周期

Activity类中定义了7种回调方法,覆盖了活动生命周期的每一个环节:

  • onCreate():完成活动的初始化操作,比如加载布局,绑定事件
  • onStart():在活动由不可见变为可见的时候调用
  • onResume():在活动准备好和用户进行交互时调用。该活动一定处于返回栈栈顶,且处于运行状态
  • onPause():系统准备去启动或者恢复另一个活动的时候调用。该方法的执行速度一定要快,否则会影响到新的栈顶活动的使用
  • onStop:在活动完全不可见时调用,与前者的区别时启动的新活动是一个对话框式的活动,那么onPause()方法会得到执行,而该方法不会
  • onDestory():在活动被销毁之前调用,之后活动变为销毁状态
  • onRestart():由停止状态变为运行时状态之前调用,活动被重新启动。

除了**onRestart()**方法之外,其他都是两两相对的,活动分为3中生存期:

  • 完整生存期:活动在onCreate()onDestrory()之间经历的就是完整生存期
  • 可见生存期:活动在onStart()onStop之间经历的就是可见生存期。活动对于用户总是可见的,即便有可能无法和用户进行交互。
  • 前台生存期:活动在onResume()onPause()之间经历的就是前台生存期。活动总是处于运行状态,此时活动可以和用户进行交互

[外链图片转存失败(img-SiLfeKn5-1565323366159)(https://developer.android.com/guide/components/images/activity_lifecycle.png)]

4.4 活动被回收

如果一个活动进入停止状态,有可能被系统回收,其中的数据在回收时可能得不到保存。

Activity中提供了一个onSaveInstanceState()回调方法,这个方法可以保证活动被回收之前一定被调用,可以通过这个方法来保存数据。

<span style="color:#000000"><code class="language-java"><span style="color:#999999">@Override</span>
    <span style="color:#c678dd">protected</span> <span style="color:#c678dd">void</span> <span style="color:#61aeee">onSaveInstanceState</span><span style="color:#999999">(</span>Bundle outState<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        <span style="color:#c678dd">super</span><span style="color:#999999">.</span><span style="color:#61aeee">onSaveInstanceState</span><span style="color:#999999">(</span>outState<span style="color:#999999">)</span><span style="color:#999999">;</span>
        String tempData <span style="color:#669900">=</span> <span style="color:#669900">"Something you just typed"</span><span style="color:#999999">;</span>
        outState<span style="color:#999999">.</span><span style="color:#61aeee">putString</span><span style="color:#999999">(</span><span style="color:#669900">"data_key"</span><span style="color:#999999">,</span> tempData<span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
</code></span>
  •  

数据的取值可以在onCreate()方法中取出

<span style="color:#000000"><code class="language-java"><span style="color:#c678dd">if</span> <span style="color:#999999">(</span>savedInstanceState <span style="color:#669900">!=</span> null<span style="color:#999999">)</span> <span style="color:#999999">{</span>
            String tempData <span style="color:#669900">=</span> savedInstanceState<span style="color:#999999">.</span><span style="color:#61aeee">getString</span><span style="color:#999999">(</span><span style="color:#669900">"data_key"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
            Log<span style="color:#999999">.</span><span style="color:#61aeee">d</span><span style="color:#999999">(</span>TAG<span style="color:#999999">,</span> tempData<span style="color:#999999">)</span><span style="color:#999999">;</span>
        <span style="color:#999999">}</span>
</code></span>
  •  

5. 横竖屏切换

App横竖屏切换的时候会销毁当前的Activity然后重新创建一个,横竖屏切换时Activity走下述生命周期:

onPause-> onStop-> onDestory-> onCreate->onStart->onResume

禁止横竖屏自动切换的话,在AndroidManifest.xml中为Activity添加一个属性:android:screenOrientaiton

6. 启动模式

启动模式一共有4种,分别是:standardsingleTopsingleTasksingleInstance。可以再AndroidManifest.xml中通过<activity>标签指定android:launchMode属性来选择启动模式。

6.1 standard

默认模式,每当启动一个新活动,就会在返回栈中入栈,并处于栈顶位置。该模式的活动无论这个活动是否在返回栈中存在,每次启动都会创建该活动的新实例。

6.2 singleTop

当活动指定为singleTop模式,启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。

6.2 singleTask

当活动的启动模式指定为singleTask,每次启动该活动系统首先会在返回栈中检查是否存在该活动的实例,如果发现就直接使用,并把这个活动之上的所有活动统统出栈。如果没有发现就创建一个新的活动实例。

6.4 singleInstance

指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动(如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈)。这种模式解决了其他程序和我们的程序共享一个活动的实例

7. 简单技巧

7.1 快速定位某个界面对应的活动

新建一个Java类:BaseActivity,继承AppCompatActivity,重写onCreate()方法。

<span style="color:#000000"><code class="language-java"><span style="color:#999999">@Override</span>
    <span style="color:#c678dd">protected</span> <span style="color:#c678dd">void</span> <span style="color:#61aeee">onCreate</span><span style="color:#999999">(</span><span style="color:#999999">@Nullable</span> Bundle savedInstanceState<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        <span style="color:#c678dd">super</span><span style="color:#999999">.</span><span style="color:#61aeee">onCreate</span><span style="color:#999999">(</span>savedInstanceState<span style="color:#999999">)</span><span style="color:#999999">;</span>
        Log<span style="color:#999999">.</span><span style="color:#61aeee">d</span><span style="color:#999999">(</span><span style="color:#669900">"BaseActivity"</span><span style="color:#999999">,</span> <span style="color:#61aeee">getClass</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">.</span><span style="color:#61aeee">getSimpleName</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
</code></span>
  •  

oncreate()方法中获取了当前实例的类名,然后将项目中所有活动的父类都不再继承AppCompatActivity,而是继承BaseActivity,这样查看日志,,每当进入一个活动的界面,该活动的类名就被打印出来。

7.2 随时退出程序

按home键只是将程序挂起,并没有退出程序,如果程序需要一个注销或者退出的功能,只需要一个专门的集合类对所有的活动进行管理就可以。

新建一个ActivityCollector类作为活动管理器:

<span style="color:#000000"><code class="language-java"><span style="color:#c678dd">public</span> <span style="color:#c678dd">class</span> ActivityCollector <span style="color:#999999">{</span>

    <span style="color:#c678dd">public</span> <span style="color:#c678dd">static</span> List<span style="color:#61aeee"><span style="color:#999999"><</span>Activity<span style="color:#999999">></span></span> activities <span style="color:#669900">=</span> <span style="color:#c678dd">new</span> ArrayList<span style="color:#669900"><</span><span style="color:#669900">></span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>

    <span style="color:#c678dd">public</span> <span style="color:#c678dd">static</span> <span style="color:#c678dd">void</span> <span style="color:#61aeee">addActivity</span><span style="color:#999999">(</span>Activity activity<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        activities<span style="color:#999999">.</span><span style="color:#61aeee">add</span><span style="color:#999999">(</span>activity<span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>

    <span style="color:#c678dd">public</span> <span style="color:#c678dd">static</span> <span style="color:#c678dd">void</span> <span style="color:#61aeee">removeActivity</span><span style="color:#999999">(</span>Activity activity<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        activities<span style="color:#999999">.</span><span style="color:#61aeee">remove</span><span style="color:#999999">(</span>activity<span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>

    <span style="color:#c678dd">public</span> <span style="color:#c678dd">static</span> <span style="color:#c678dd">void</span> <span style="color:#61aeee">finishAll</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>
        <span style="color:#c678dd">for</span> <span style="color:#999999">(</span>Activity activity <span style="color:#669900">:</span> activities<span style="color:#999999">)</span> <span style="color:#999999">{</span>
            <span style="color:#c678dd">if</span> <span style="color:#999999">(</span><span style="color:#669900">!</span>activity<span style="color:#999999">.</span><span style="color:#61aeee">isFinishing</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>
                activity<span style="color:#999999">.</span><span style="color:#61aeee">finish</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
            <span style="color:#999999">}</span>
        <span style="color:#999999">}</span>
    <span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  •  

修改BaseActivity

<span style="color:#000000"><code class="language-java"><span style="color:#c678dd">public</span> <span style="color:#c678dd">class</span> BaseActivity <span style="color:#c678dd">extends</span> AppCompatActivity <span style="color:#999999">{</span>

    <span style="color:#999999">@Override</span>
    <span style="color:#c678dd">protected</span> <span style="color:#c678dd">void</span> <span style="color:#61aeee">onCreate</span><span style="color:#999999">(</span><span style="color:#999999">@Nullable</span> Bundle savedInstanceState<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        <span style="color:#c678dd">super</span><span style="color:#999999">.</span><span style="color:#61aeee">onCreate</span><span style="color:#999999">(</span>savedInstanceState<span style="color:#999999">)</span><span style="color:#999999">;</span>
        Log<span style="color:#999999">.</span><span style="color:#61aeee">d</span><span style="color:#999999">(</span><span style="color:#669900">"BaseActivity"</span><span style="color:#999999">,</span> <span style="color:#61aeee">getClass</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">.</span><span style="color:#61aeee">getSimpleName</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        ActivityCollector<span style="color:#999999">.</span><span style="color:#61aeee">addActivity</span><span style="color:#999999">(</span><span style="color:#c678dd">this</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>

    <span style="color:#999999">@Override</span>
    <span style="color:#c678dd">protected</span> <span style="color:#c678dd">void</span> <span style="color:#61aeee">onDestroy</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>
        <span style="color:#c678dd">super</span><span style="color:#999999">.</span><span style="color:#61aeee">onDestroy</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        ActivityCollector<span style="color:#999999">.</span><span style="color:#61aeee">removeActivity</span><span style="color:#999999">(</span><span style="color:#c678dd">this</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>

如果需要在某个地方退出程序,调用ActivityCollector.finishAll()方法就可以。

可以再销毁所有活动代码的后面加上杀掉当前进程,确保程序完全退出:

<span style="color:#000000"><code class="language-java">android<span style="color:#999999">.</span>os<span style="color:#999999">.</span>Process<span style="color:#999999">.</span><span style="color:#61aeee">killProcess</span><span style="color:#999999">(</span>android<span style="color:#999999">.</span>os<span style="color:#999999">.</span>Process<span style="color:#999999">.</span><span style="color:#61aeee">myPid</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
</code></span>
  • 1

7.2启动活动最佳写法

如果你的模块需要将一些重要数据传递给另一个模块,例如两个字符串参数,但是你不清楚启动这个活动需要传递哪些数据,只需在启动活动添加一个actionStart()方法。

<span style="color:#000000"><code class="language-java"><span style="color:#c678dd">public</span> <span style="color:#c678dd">static</span> <span style="color:#c678dd">void</span> <span style="color:#61aeee">actionStart</span><span style="color:#999999">(</span>Context context<span style="color:#999999">,</span> String data1<span style="color:#999999">,</span> String data2<span style="color:#999999">)</span> <span style="color:#999999">{</span>
        Intent intent <span style="color:#669900">=</span> <span style="color:#c678dd">new</span> Intent<span style="color:#999999">(</span>context<span style="color:#999999">,</span> SecondActivity<span style="color:#999999">.</span><span style="color:#c678dd">class</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        intent<span style="color:#999999">.</span><span style="color:#61aeee">putExtra</span><span style="color:#999999">(</span><span style="color:#669900">"param1"</span><span style="color:#999999">,</span> data1<span style="color:#999999">)</span><span style="color:#999999">;</span>
        intent<span style="color:#999999">.</span><span style="color:#61aeee">putExtra</span><span style="color:#999999">(</span><span style="color:#669900">"param2"</span><span style="color:#999999">,</span> data2<span style="color:#999999">)</span><span style="color:#999999">;</span>
        context<span style="color:#999999">.</span><span style="color:#61aeee">startActivities</span><span style="color:#999999">(</span>intent<span style="color:#999999">)</span><span style="color:#999999">;</span>
    <span style="color:#999999">}</span>
</code></span>
  •  

如果你想要启动该活动,只需:

<span style="color:#000000"><code class="language-java">button1<span style="color:#999999">.</span><span style="color:#61aeee">setOnClickListener</span><span style="color:#999999">(</span><span style="color:#c678dd">new</span> View<span style="color:#999999">.</span>OnClickListener<span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>

            <span style="color:#999999">@Override</span>
            <span style="color:#c678dd">public</span> <span style="color:#c678dd">void</span> <span style="color:#61aeee">onClick</span><span style="color:#999999">(</span>View v<span style="color:#999999">)</span> <span style="color:#999999">{</span>
            	SecondActivity<span style="color:#999999">.</span><span style="color:#61aeee">actionStart</span><span style="color:#999999">(</span>FirstActivity<span style="color:#999999">.</span><span style="color:#c678dd">this</span><span style="color:#999999">,</span> <span style="color:#669900">"data1"</span><span style="color:#999999">,</span> <span style="color:#669900">"data2"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
            <span style="color:#999999">}</span>
 <span style="color:#999999">}</span></code></span>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是五道关于 Android 基础知识的多选题: 1. 下列哪个是 Android 应用程序组件? A. Activity B. Intent C. Service D. Broadcast Receiver 答案:A、C、D 解析:Android 应用程序通常由四个基本组件组成,包括 Activity、Service、Broadcast Receiver 和 Content Provider。Activity 用于提供用户界面,Service 用于在后台执行长时间运行的操作,Broadcast Receiver 用于接收系统或其他应用程序发出的广播消息,Content Provider 用于管理应用程序的数据。因此,选项 A、C、D 是 Android 应用程序组件。 2. 下列哪个选项描述了 Android 应用程序中的布局文件? A. 布局文件用于定义用户界面的视图和组件。 B. 布局文件用于定义应用程序的后台服务。 C. 布局文件用于定义应用程序的数据模型。 D. 布局文件用于定义应用程序的活动和生命周期。 答案:A 解析:Android 应用程序中的布局文件用于定义用户界面的视图和组件,包括按钮、文本框、图像、列表和其他用户界面元素。布局文件通常使用 XML 格式编写,可以通过调整布局文件来设计和定制应用程序的用户界面。因此,选项 A 描述了 Android 应用程序中的布局文件。 B、C、D 选项描述的不是 Android 应用程序中的布局文件。 3. 下列哪个选项描述了 Android 应用程序的生命周期? A. 应用程序的生命周期由 onCreate、onStart 和 onPause 等方法组成。 B. 应用程序的生命周期由 Activity、Service、Broadcast Receiver 和 Content Provider 组成。 C. 应用程序的生命周期由 Intent、PendingIntent 和 Notification 等组件组成。 D. 应用程序的生命周期由 UI 线程、后台线程和数据库线程组成。 答案:A 解析:Android 应用程序的生命周期由一系列方法组成,包括 onCreate、onStart、onResume、onPause、onStop、onDestroy 等。这些方法定义了应用程序在不同状态下的行为和操作,如启动、暂停、停止和销毁应用程序。因此,选项 A 描述了 Android 应用程序的生命周期。 B、C、D 选项描述的不是 Android 应用程序的生命周期。 4. 下列哪个选项描述了 Android 应用程序的资源文件? A. 资源文件用于存储应用程序的图像、文本和其他非代码资源。 B. 资源文件用于存储应用程序的 Java 代码。 C. 资源文件用于存储应用程序的布局文件。 D. 资源文件用于存储应用程序的数据模型。 答案:A、C 解析:Android 应用程序的资源文件用于存储应用程序的图像、文本、布局文件和其他非代码资源。资源文件通常使用 XML 格式编写,可以在应用程序代码中使用 R 类来引用这些资源。因此,选项 A、C 描述了 Android 应用程序的资源文件。 B、D 选项描述的不是 Android 应用程序的资源文件。 5. 下列哪个选项是 Android 应用程序中的常用布局类型? A. LinearLayout B. RelativeLayout C. TableLayout D. GridLayout 答案:A、B、C、D 解析:Android 应用程序中有许多布局类型可供使用,包括 LinearLayout、RelativeLayout、TableLayout 和 GridLayout 等。LinearLayout 可以将视图垂直或水平排列,RelativeLayout 可以将视图相对于其他视图定位,TableLayout 可以将视图按照表格形式排列,而GridLayout 可以将视图按照网格形式排列。因此,选项 A、B、C、D 都是 Android 应用程序中的常用布局类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值