Android笔记:Activity
1.Android可視化界面結構:
? ? 一個Android應用的可視化界面最底層是Activity,在他之上是一個Window對象,在window之上通常是布局容器,再上面才是用戶直接交互的組件(按鈕,文本框)
交互組件(UI控件)-->布局容器(layout)--->Window對象--->Activity
2.Activity生命周期
? ? Activity是以棧的形式管理的,當前活動的Activity位于棧頂,其他的Activity則處于非活動狀態.
? ? ? ?Activiy生命周期中的4個重要狀態
? ? ? ? ? ??活動 處于棧頂位置,用戶進行交互
? ? ? ? ? ? 暫停 可見但失去焦點,用戶不能進行交互
? ? ? ? ? ? 停止 不可見
? ? ? ? ? ? 銷毀 被系統和進程Kill掉
? ? ? ? ?細分Activity生命周期為3個關鍵的嵌套子周期:
? ? ? ? ? ? 首尾:第一次調用onCreate()到最后調用onDestroy().對應的做全局的初始化,以及最后的釋放.
? ? ? ? ? ? 可見但不一定交互:從調用onStart()到對應調用一次onStop(),用戶可以在屏幕上看到Activity但不一定能與之交互,可以在這期間維護向用戶顯示的資源.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? onReSart()被停止的Activity重新被啟動.
? ? ? ? ? ?活動周期:從調用onResume()到對應的onPause(),活動的activtiy與用戶進行交互
3.控制Activity的生命周期
? ? 用戶很多常見的操作都會引起Activity的暫停,停止,結束甚至啟動多個程序版本,對于程序而言,這些都應該是要盡量避免的.
? ? 3.1強制執行單任務模式:
? ? ? ? 比如當程序執行跳轉操作之后再次的啟動,可能會在手機上產生多個Activity實例(系統自動Kill多余的實例或者引發異常).
? ? ? ? 那么我們為了保證任何時候,每個Activity都只有一個正在運行的實例,只需要在AndroidManifest.xml的Activity元素中加入以下代碼:
? ? ? ??android:lauchMode="singleInstance"
? ? ? ? 如果想要限制一個程序中只有一個activity實例,只需要在AndroidManifest.xml的Activity元素中加入以下代碼:
? ? ? ??android:lauchMode="singleTask"
? ?3.2強制手機屏幕方向
? ? ? ? 手機屏幕方向改變時,Activity被結束然后再重新啟動,這樣導致程序丟失了當前的狀態.
? ? ? ? 那么有一種方案是禁止切換應用程序的視圖(屏幕方向的切換),在AndroidManifest.xml的Activity元素中加入以下代碼:
? ? ? ? android:screenOrientation="portrait"(縱向)或者android:screenOrientation="landscape"(橫向)
??????? 問題還沒有完全解決,以上代碼只是將程序始終保存在指定的方向,并不能防止Activity的重新啟動的一系列操作.
??????? 要實現不重啟,還需要在AndroidManifest.xml中設置
??????? android:configChanges="orientation|keyboradHidden"(手機屏幕方向,鍵盤滑出時觸發),事件為onConfigurationChanged(Configuration newConfig)
?? 3.3保存和恢復Activity的信息
?????? 手機屏幕方向改變時,Activity被結束然后再重新啟動,這樣導致程序丟失了當前的狀態.
?????? 我們可以保存當前Activity的信息,然后再重啟是恢復之前的信息
?????? 實現這一想法就是:onSaveInstanceState和onRestoreInstanceState
?????? 原理:當一個Activty即將被Kill時,通過重寫onSaveInstanceState來保存需要保存的狀態的相關信息,當重新創建該Activity后,之前onSaveInstanceState保存的狀態信息將
通過Bundle傳遞給onCreate方法,然后就可以利用onRestoreInstanceState方法來保存恢復之前的狀態信息了.
值得注意一下:
觸發onSaveInstanceState的幾個操作:(實際Activity銷毀)
1.當用戶按下HOME鍵
2.長按HOME
3.按下電源按鍵,屏保狀態
4.屏幕方向切換(不設置configChanges)
Note:除了第4種,其他的3種情況,onSaveInstanceState和onRestoreInstanceState不一定是被成對調用的.
4.Activity的交互
??? 4.1啟動另一個Activity(跳轉)
??????? 1.定義一個Intent,并為該Intent指定即將被啟動的Activity
???????? Intent newActivityIntent=new Intent(this,NewActivity.class);
??????? 2.調用Intent的startActivity方法啟動并跳轉到新的Activity
???????? startActivity(neActivityIntent);
??????? 3.當新的Activity執行完畢之后,調用finish方法結束當前Activity,并將控制權交回給調用它的Activity.
???????? finish();
??????? 4.在ActivityManifest.xml中聲明新的Activity(注冊)
??? 4.2啟動另一個Activity并返回結果
??????? 1.定義一個Intent,并為該Intent指定即將被啟動的Activity
??????? 2.調用startActivityForResult(Intent intent,int requestCode)跳轉并標記requestCode
??????? 3.重寫onActivityResult(int requestCode,int resultCode,intent data)解析返回的數據
??????? 4.在另一個Activity中調用setResult(RESULT_OK,backintent)
Note:在Activity之間傳遞數據Bundle:一個類型安全的容器,只能存儲基本數據類型或基本類型的數組,如string,int,byte和boolean等
?
?
代碼:
string資源文件:
<?xml version="1.0" encoding="utf-8"?> <resources><string name="app_name">SetupNewActivity</string><string name="hello_world">Hello world!</string><string name="StartActivitiy">這是啟動頁面的Activity</string><string name="NewActivity">啟動新的Activity</string><string name="EndNewActivity">結束當前Activity</string><string name="ShowNewActivity">這是新啟動的Activity界面</string> </resources>主頁面:activity_lauch.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="${relativePackage}.${activityClass}" ><TextView android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/StartActivitiy"/><Button android:text="@string/NewActivity"android:id="@+id/SetupNew"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_horizontal"android:layout_marginTop="20dp"/> </RelativeLayout>跳轉頁面:activity_new.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="${relativePackage}.${activityClass}" ><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/ShowNewActivity"></TextView><Buttonandroid:text="@string/EndNewActivity"android:id="@+id/End"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_horizontal"android:layout_marginTop="20dp"></Button> </RelativeLayout>LauchActivity.java:
package com.YZR.setupnewactivity;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;public class LauchActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_lauch);Button setupButton=(Button)findViewById(R.id.SetupNew);setupButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub setupNewActivity();}});}private void setupNewActivity() {// TODO Auto-generated method stubIntent newActivityIntent=new Intent(LauchActivity.this,NewActivity.class);startActivity(newActivityIntent);} }NewActivity.java
package com.YZR.setupnewactivity;import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;public class NewActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_new);Button endButton=(Button)findViewById(R.id.End);endButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub finish();}});} }AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.YZR.setupnewactivity"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="21" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="LauchActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name="NewActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity></application></manifest>????
下一節再介紹傳值跳轉.
?
僅供學習之用.
END
<?xml version="1.0" encoding="utf-8"?>
<resources>
??? <string name="app_name">SetupNewActivity</string>
?? ?
??? <string name="hello_world">Hello world!</string>
??? <string name="StartActivitiy">這是啟動頁面的Activity</string>
??? <string name="NewActivity">啟動新的Activity</string>
??? <string name="EndNewActivity">結束當前Activity</string>
??? <string name="ShowNewActivity">這是新啟動的Activity界面</string>
</resources>
轉載于:https://www.cnblogs.com/Francis-YZR/p/4892595.html
總結
以上是生活随笔為你收集整理的Android笔记:Activity的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 由于TempDB设置错误导致SQL Se
- 下一篇: 即时聊天IM之一 XMPP协议简述