日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android 回退 activity,Android Activity要点(2)

發(fā)布時間:2025/3/19 Android 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 回退 activity,Android Activity要点(2) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、帶返回值的Activity回退過程

一般情況下,我們要從當前Activity跳轉(zhuǎn)到另一個Activity,采用的方法是通過startActivity(Intent)來攜帶數(shù)據(jù)并實現(xiàn)跳轉(zhuǎn)

有時候又需要跳轉(zhuǎn)到的Activity能夠在回退時返回處理結(jié)果給前一個Activity,這就要用到以下方法了public?void?startActivityForResult(Intent?intent,?int?requestCode)

該方法同樣是用于實現(xiàn)Activity的跳轉(zhuǎn),不過多了一個int類型的請求碼requestCode

requestCode用于標示當Activity回退時,處理結(jié)果是從哪一個Activity傳遞來的,因為當前Activity有可能需要跳轉(zhuǎn)到多個Activity

此外,Activity類還包含有以下方法protected?void?onActivityResult(int?requestCode,?int?resultCode,?Intent?data)

requestCode即是請求碼,resultCode用于標示數(shù)據(jù)處理結(jié)果,data用于攜帶數(shù)據(jù)

因此,我們可以用以下代碼實現(xiàn)Activity的跳轉(zhuǎn)private?int?REQUEST_CODE?=?10;

Intent?intent?=?new?Intent(MainActivity.this,?Main2Activity.class);

Bundle?bundle?=?new?Bundle();

bundle.putString("requestText",?"啊哈");

intent.putExtras(bundle);

startActivityForResult(intent,?REQUEST_CODE);

向Intent中傳入需要傳遞給Main2Activity的數(shù)據(jù)

然后,在onActivityResult中處理Main2Activity回退后傳遞而來的數(shù)據(jù)處理結(jié)果,這里用Log來輸出@Override

protected?void?onActivityResult(int?requestCode,?int?resultCode,?Intent?data)?{????????if?(resultCode?==?RESULT_OK?&&?requestCode?==?REQUEST_CODE)?{

Bundle?bundle?=?data.getExtras();

Log.e("MainActivity",?bundle.getString("responseText"));

}????????super.onActivityResult(requestCode,?resultCode,?data);

}

其中,需要判斷requestCode是否與請求碼相等

此外,查看源碼可知,resultCode取值一般為以下三個,用來標示操作結(jié)果/**?Standard?activity?result:?operation?canceled.?*/

//標示操作取消

public?static?final?int?RESULT_CANCELED????=?0;

/**?Standard?activity?result:?operation?succeeded.?*/

//標示操作成功

public?static?final?int?RESULT_OK???????????=?-1;

/**?Start?of?user-defined?activity?results.?*/

public?static?final?int?RESULT_FIRST_USER???=?1;

以上都是在MainActivity中操作,此外還需要在Main2Activity中設置返回結(jié)果

先取出傳遞而來的數(shù)據(jù)requestTextprivate?String?requestText;????@Override

protected?void?onCreate(Bundle?savedInstanceState)?{????????super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main2);

Intent?intent?=?getIntent();????????if?(intent?!=?null)?{

Bundle?bundle?=?intent.getExtras();????????????if?(bundle?!=?null)?{

requestText?=?bundle.getString("requestText");

}

}

init();

}

通過setResult方法設置處理結(jié)果為RESULT_OK,并通過intent攜帶處理結(jié)果public?void?init()?{

findViewById(R.id.response).setOnClickListener(new?View.OnClickListener()?{????????????@Override

public?void?onClick(View?v)?{

Intent?intent?=?new?Intent();

Bundle?bundle?=?new?Bundle();

bundle.putString("responseText",?"收到第一個Activity的請求內(nèi)容為:"?+?requestText);

intent.putExtras(bundle);

setResult(RESULT_OK,?intent);

finish();

}

});

}

這樣就可以實現(xiàn)當Activity回退時,攜帶處理結(jié)果到前一個Activity了

二、關于Activity啟動模式的補充說明

在上一篇博文中已經(jīng)介紹過Activity的四種啟動模式了,這里再來補充一些內(nèi)容singleTask

此為棧內(nèi)復用模式

如果以在AndroidManifest中聲明屬性的方式來設定啟動模式的話,如果不指定taskAffinity屬性,該Acitvity只會存在于當前棧中

想要讓Activity以單實例的方式存在于一個新的棧的話,可以這樣聲明:

android:name=".Main2Activity"

android:launchMode="singleTask"

android:taskAffinity="com.custom.czy"?/>

注意,taskAffinity的值不能與包名相同,不然就相當于沒有設置了

可以通過getTaskId()方法來查看當前Activity位于哪個棧,如:@Override

protected?void?onCreate(Bundle?savedInstanceState)?{????????super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.e("第一個Activity",?getTaskId()?+?"");

}singleInstance

即單實例模式

采用此種模式的Activity均會獨立存在于一個棧內(nèi),即使兩個Activity的taskAffinity屬性相同

例如

android:name=".Main2Activity"

android:launchMode="singleInstance"

android:taskAffinity="com.custom.czy"?/>

android:name=".Main3Activity"

android:launchMode="singleInstance"

android:taskAffinity="com.custom.czy"?/>

Main2Activity和Main3Activity均聲明為singleInstance模式且棧名為com.custom.czy

但通過Log.e("Activity", getTaskId() + "");查看,還是可以發(fā)現(xiàn)兩個Activity存在于不同的棧中

三、Activity的隱式調(diào)用

隱式調(diào)用不需要明確指定要調(diào)用的Activity信息,而是根據(jù)Intent具有的信息去匹配目標組件的IntentFilter中所設置的過濾信息,如果匹配成功則啟動,否則會報錯

一個Activity可以包含有多個IntentFilter,只要Intent能夠匹配其中一組< intent-filter >即可啟動該Activity

IntentFilter具有的屬性有:action、category、dataaction

action屬性值是一個字符串,系統(tǒng)也為我們提供了多個action,如Intent.ACTION_VIEW可用于打開系統(tǒng)自帶的瀏覽器

在 < intent-filter >中可以聲明多個action,只要求Intent中攜帶的action字符串與其中一個相同即成功匹配該Activity

Intent中必須含有action屬性,否則將直接匹配失敗

public?void?startActivity(View?view)?{

Intent?intent?=?new?Intent("com.bb.hh");

intent.setAction("com.czy.action");

Log.e("++++++",?intent.getAction());

startActivity(intent);

}

這樣依然可以成功啟動Activitycategory

在< intent-filter >中同樣可以設定多個category屬性,且Intent也可以通過addCategory(String category)添加多個category

與action屬性不同的是,只要是在Intent中包含的category值,< intent-filter >都必須有category與之一一匹配,否則匹配失敗

需要注意的是,系統(tǒng)在startActivity(Intent intent)的時候,會自動為Intent添加一個默認的category值,即:android.intent.category.DEFAULT

所以為了讓Activity可以通過隱式調(diào)用的方式啟動,需要在< intent-filter >同樣為之添加一個默認的category值

如上述代碼所示data

data屬性用于指定當前活動能夠響應什么類型的數(shù)據(jù)

如系統(tǒng)自帶的瀏覽器自然就能響應http模式的網(wǎng)絡連接要求,因此我們可以用隱式調(diào)用的方式來調(diào)用瀏覽器打開指定網(wǎng)頁Intent?intent?=?new?Intent(Intent.ACTION_VIEW);

intent.setData(Uri.parse("http://www.baidu.com"));

startActivity(intent);

如果過濾規(guī)則中設置了data屬性,則Intent中也必須含有data屬性且相同才能匹配成功

data包含的屬性值有:

android:host="string"

android:port="string"

android:path="string"

android:pathPattern="string"

android:pathPrefix="string"

android:mimeType="string"/>

data由兩部分組成,mimeType和URI

mimeType指媒體類型,可以是:image/jpeg、video/*,用于表示圖片、文本、視頻等不同的媒體格式

URL的結(jié)構(gòu)如下所示:

< scheme>://< host>:< port>/[< path>|< pathPrefix>|< pathPatten>]

scheme:URI的模式,如http,file,content,默認值為(content和file)

host:URI的主機名,比如www.baidu.com

port:URI的端口號

path、pathPatten和pathPrefix這三個參數(shù)表示路徑信息

如,可以設置某Activity能夠處理的數(shù)據(jù)類型為圖片image

則可以通過設置mimeType屬性來啟動該Activitypublic?void?startActivity(View?view)?{

Intent?intent?=?new?Intent("com.bb.hh");

intent.setAction("com.czy.action");

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

intent.setType("image/png");

startActivity(intent);

}

或者為Intent設置完整的data屬性public?void?startActivity(View?view)?{

Intent?intent?=?new?Intent("com.bb.hh");

intent.setAction("com.czy.action");

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

intent.setDataAndType(Uri.parse("file://abc"),"image/png");

startActivity(intent);

}

此外,由于通過隱式調(diào)用有可能因為匹配不成功而導致報錯,所以在調(diào)用之前可以先判斷當前是否有合適的ActivityIntent?intent?=?new?Intent("com.bb.hh");

intent.setAction("com.czy.action");

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

intent.setDataAndType(Uri.parse("file://abc"),?"image/png");

ComponentName?componentName?=?intent.resolveActivity(getPackageManager());????????if?(componentName?!=?null)?{????????????String?name?=?componentName.getClassName();

Log.e("MainActivity:",?"匹配成功:"?+?name);

startActivity(intent);

}?else?{

Log.e("MainActivity:",?"匹配失敗");

}

如果匹配失敗,resolveActivity方法就會返回null,否則就會返回匹配度最高的Activity信息

作者:leavesC

總結(jié)

以上是生活随笔為你收集整理的android 回退 activity,Android Activity要点(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。