Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> [android,14]14.為應用程序多個activity的應用和數據的傳輸

[android,14]14.為應用程序多個activity的應用和數據的傳輸

編輯:關於Android編程

一、創建一個自定義界面:

1、自定義一個Activity類 要繼承系統的Activity類。

public classDemo2Activity extends Activity {

 

public void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main2); //指定布局

}

}

 

2、在清單文件AndroidManifest.xml中聲明一個activity元素

android:icon="@drawable/ic_launcher"

android:label="@string/app_name" >

android:name=".DemoActivity"

android:label="@string/app_name" >

 

 

 

 

android:name=".Demo2Activity"//配置類名

android:label="我是第二個activity" > //指定標題

//意圖過濾器

 

 

android:host="cn.itcast" android:path="/gaga"

android:mimeType="audio/mpeg"/>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3、指定布局文件:創建res/layout/main2.xml布局文件:

 

 

二、在第一個頁面上點擊一個按鈕跳到第二個頁面:

 

激活組件使用系統提供的Intent類。

 

三、顯示意圖:

顯示意圖 需要知道要激活組件的類名。

顯示意圖一般用在同一個應用程序中組件的相互激活。

//第一個頁面的activity類:

public class DemoActivity extendsActivity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

 

}

//點擊按鈕 跳到第二個頁面的方法:

public void click(View view){

// Intent 的作用就是激活組件.

 

// 顯示意圖 一般用在同一個應用程序中 組件的相互激活

顯示意圖的多種寫法:

①//Intentintent = new Intent(this,Demo2Activity.class);

Intent intent = new Intent();

②//intent.setClass(this,Demo2Activity.class);

③//intent.setClassName("cn.itcast.mutileactivity",

"cn.itcast.mutileactivity.Demo2Activity");

④//intent.setClassName(this,

"cn.itcast.mutileactivity.Demo2Activity");

⑤//intent.setComponent(newComponentName(this,

"cn.itcast.mutileactivity.Demo2Activity"));

//激活意圖:

startActivity(intent);

}

 

四、隱式意圖:

隱式意圖主要用在不同程序中的組件間的激活。如撥打電話的意圖.

隱式意圖:操作系統要根據action data mimetype category 進行一個查詢, 所以隱式意圖的效率要比現實意圖的效率低一點 。

每個activity系統都會默認指定category 為android.intent.category.DEFAULT

 

1、 在AndroidManifest.xml清單文件中:指定一個意圖過濾器:

android:name=".Demo2Activity" //配置類名

android:label="我是第二個activity" > //指定標題

//意圖過濾器

//當前意圖對應的動作,name的可隨意給

 

//為意圖配置數據,當意圖的action相同時,根據data數據區分具體的業務。

 

android:host="cn.itcast" //主機名

android:path="/gaga" //路徑

android:mimeType="audio/mpeg"/> //數據類型

//category元素,配置系統給定的意圖。

 

 

 

 

注意:①、一個activity可以配置多個意圖過濾器:

②、在定義的意圖過濾器中,要根據業務需求指定category元素的屬性對應意圖和當前意圖對應的動作,

 

 

 

2、 隱式意圖:頁面跳轉的點擊事件:

//隱式的意圖

public void click2(View view){

//用於不同應用程序之間組件的激活

// 操作系統要根據action data mimetype category 進行一個查詢

// 隱式意圖的效率要比現實意圖的效率低一點

Intentintent = new Intent();

//設置動作:將在清單文件指定好的動作設置進來

intent.setAction("cn.itcast.mutileactivity.haha");

//

 

使用設置數據和類型的方法,itcast://cn.itcast/gaga 為:命名空間://主機名/路徑 .都是在清單文件中配置的。

intent.setDataAndType(Uri.parse("itcast://cn.itcast/gaga"),"audio/mpeg");

//添加組件的category

intent.addCategory("android.intent.category.DEFAULT");

startActivity(intent);

 

注意://設置數據類型

intent.setType("audio/mpeg");

//設置數據

intent.setData(Uri.parse("itcast://cn.itcast/gaga"));*/

上面兩個方法是互斥的,在設置數據和類型時,要使用setDataAndType()方法設置才可以。

 

例: 激活打電話意圖的方法:

public void click3(View view){

Intent intent = new Intent();

intent.setAction("android.intent.action.CALL");

intent.setData(Uri.parse("tel:12345"));

startActivity(intent);

}

例:激活發短信意圖的方法:

public void click4(View view){

Intent intent = new Intent();

intent.setAction("android.intent.action.VIEW");

intent.addCategory("android.intent.category.BROWSABLE");

intent.setData(Uri.parse("sms:5556"));

intent.putExtra("sms_body","nihao haha");

startActivity(intent);

}

 

五、在多個activity之間傳遞數據:

業務需求:將第一個頁面中的輸入的數據,在第二個頁面中顯示:

1、第一個頁面的activity類

public class DemoActivity extendsActivity {

privateEditText editText1;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//獲取文本框組件

editText1 = (EditText) this.findViewById(R.id.editText1);

}

 

//點擊按鈕的事件方法,激活第二個組件。

publicvoid click(View view){

//獲取文本組件的值:

String name =editText1.getText().toString().trim();

//激活第二個意圖

Intent intent = newIntent(this,HelloActivty.class);

//在意圖中設置傳遞的值,就是傳遞的數據。

intent.putExtra("name",name);

 

//批量數據傳遞 ,使用Bundle 對象,相當於map集合。

Bundle extras = new Bundle();

extras.putString("name",name);

intent.putExtras(extras);

 

startActivity(intent);

}

}

 

2、第二個頁面的activity類:

public class HelloActivty extendsActivity {

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

 

// 獲取激活我的意圖:獲取激活本組件的意圖:

Intent intent = getIntent();

//根據key獲取在意圖中的數據

String name = intent.getStringExtra("name");

//獲取批量的數據

Bundle extras = intent.getExtras(); //獲取bundle對象。

String name = extras.getString("name");

//創建組件:

TextView tv = new TextView(this);

tv.setText("你好:"+name);

setContentView(tv);

}

}

六、關閉一個activity並獲取這個activity的返回值:

1、業務需求:該activity中是聯系人名稱的列表,當選中一個聯系人時,關閉當前的activity,返回選中聯系人的姓名。在另外一個activity中獲取關閉的activity的返回值。

 

2、//要被關閉的activity:

public class ContactListActivity extendsActivity {

private ListView lv;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.contact_list);

lv = (ListView) this.findViewById(R.id.lv);

Uri uri =Uri.parse("content://com.android.contacts/raw_contacts");

Cursor cursor = this.getContentResolver().query(

uri,null, null, null, null);

final List names = newArrayList();

while (cursor.moveToNext()) {

 

String id = cursor.getString(cursor.getColumnIndex("_id"));

String name =

cursor.getString(cursor.getColumnIndex("display_name"));

//System.out.println(id);

System.out.println("姓名"+ name);

//System.out.println("--");

names.add(name);

 

}

cursor.close();

//為listView設置適配器:

lv.setAdapter(newArrayAdapter(this, R.layout.item, R.id.tv, names));

//設置listView的點擊事件:

lv.setOnItemClickListener(newOnItemClickListener() {

 

@Override

publicvoid onItemClick(AdapterViewparent, View view,

intposition, long id) {

//獲取點擊列表的聯系人名稱

String name = names.get(position);

//設置當前activity被關閉的時候的結果數據

Intent data = new Intent();

data.putExtra("name", name);

//設置當前activity結果集的方法

方法參數:(結果碼,返回的數據)

setResult(position, data);

//關閉當前的activity

ContactListActivity.this.finish();

}

});

}

}

3、//接收關閉的activity返回值的activity:

public class DemoActivity extendsActivity {

privateEditText editText1,editText2;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

editText1 = (EditText) this.findViewById(R.id.editText1);

editText2 = (EditText) this.findViewById(R.id.editText2);

}

//點擊按鈕開啟聯系人列表視圖

public void click(View view){

Intent intent = new Intent(this,ContactListActivity.class);

//啟動activity並可以獲取返回值的方法。

方法參數(視圖,請求碼)

startActivityForResult(intent,1);

}

public void click2(View view){

Intent intent = newIntent(this,ContactListActivity.class);

//startActivity(intent);

 

startActivityForResult(intent, 2);

}

 

//當新激活的界面銷毀,重新回到這個界面,會執行此方法,

該方法參數:

第一個參數:請求碼,對應上面startActivityForResult方法中設置的請求碼,用於區分是哪

個事件的操作。

第二個參數:結果碼,獲取銷毀頁面中setResult()方法中設置的結果碼。

第三參數:銷毀界面的返回值.

protected void onActivityResult(int requestCode, int resultCode, Intentdata) {

if(data!=null){

 

Toast.makeText(this, "點擊了第"+resultCode+"個條目", 0).show();

String name = data.getStringExtra("name");

 

if(requestCode==1)

editText1.setText(name);

if(requestCode==2)

editText2.setText(name);

}

 

 

super.onActivityResult(requestCode,resultCode, data);

}

 

}

七、activity的生命周期:

1、activity生命周期中依次執行的方法:

onCreate :activity被創建時調用的方法

onStart :界面可見的時候調用

onResume :當界面獲取焦點時調用

onPause :當界面失去焦點時調用

onStop :當用戶看不到界面時調用。

onDestory:activity被銷毀時調用的方法.

 

當內存不足或結束結束進程時,會調用onDestory方法銷毀activity。

當一個界面創建出來後執行了onStop方法了,當再次被顯示出來時,先調用onRestart方法,然後是onStart、onResume 方法。

2、生命周期的應用場景:

當在播放視頻時來電,在onStop方法中暫停視頻 ,在電話打完,在onStart方法中將暫停的視頻重新播放。

 

 

八、activity橫豎屏切換的生命周期:

在默認的情況下,橫豎屏切換會先銷毀activity再創建activity;

為了在切換橫豎屏時,不銷毀activity要在清單文件配置:

android:configChanges="keyboardHidden|orientation"

 

android:name=".LifecycleActivity"

android:configChanges="keyboardHidden|orientation"

android:label="@string/app_name" >

 

 

 

 

 

當橫豎屏切換時會執行activity類中的onConfigurationChanged()方法:

//橫豎屏切換的activity類:

public class LifecycleActivity extendsActivity {

@Override

public voidonConfigurationChanged(Configuration newConfig) {

//TODO Auto-generated method stub

super.onConfigurationChanged(newConfig);

System.out.println("configchange");

}

}

九、指定新創建的activity是一個對話框的形式:

在清單文件中指定:activity的樣式:

 

android:theme="@android:style/Theme.Dialog" //對話框樣式。

>

 

十、activity的啟動模式 和 task任務棧、:

1、task任務棧:

Task (任務棧):一組任務的集合。 使用任務棧管理activity(任務),

Task任務棧主要用來存放已經打開的activity的引用,最近打開的activity處於任務棧的棧頂,棧頂的activity是用戶可見的activity。

通過任務棧系統可以管理應用程序的行為(管理應用程序如何打開,如何退出).

 

在activity類中 通過getTaskId()獲取任務棧的id。

 

 

 

2、Activity的啟動模式:

①、Standard:默認模式。

②、singleTop:如果task棧棧頂是activityB,再去開啟activityB,就不會創建新的activityB的實例。

當復用棧頂的組件時會調用activityB類中中的onNewIntent()方法.

 

例:浏覽器添加書簽的應用。

③、singleTask:當開啟新的activity的時候,首先判斷任務棧裡面是否存在要激活的activity,如果存在的話,就直接把這個已經存在的activity在任務棧中上面的其他activity都給清除掉,然後復用這個已經存在的activity。

應用場景:創建浏覽器的BrowserActivity實例使用該模式。

④、singleInstance模式:首先開啟一個activityA在任務棧A中,再開啟一個新的activityB,此時就會創建一個新的任務棧B,用於存放activityB,在任務棧A的棧頂保留了對activityB的引用。

 

 

 

任務棧模型:

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved