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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

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

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

一、帶返回值的Activity回退過(guò)程

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

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

該方法同樣是用于實(shí)現(xiàn)Activity的跳轉(zhuǎn),不過(guò)多了一個(gè)int類型的請(qǐng)求碼requestCode

requestCode用于標(biāo)示當(dāng)Activity回退時(shí),處理結(jié)果是從哪一個(gè)Activity傳遞來(lái)的,因?yàn)楫?dāng)前Activity有可能需要跳轉(zhuǎn)到多個(gè)Activity

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

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

因此,我們可以用以下代碼實(shí)現(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回退后傳遞而來(lái)的數(shù)據(jù)處理結(jié)果,這里用Log來(lái)輸出@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是否與請(qǐng)求碼相等

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

//標(biāo)示操作取消

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

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

//標(biāo)示操作成功

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

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

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

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

先取出傳遞而來(lái)的數(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();

}

通過(guò)setResult方法設(shè)置處理結(jié)果為RESULT_OK,并通過(guò)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",?"收到第一個(gè)Activity的請(qǐng)求內(nèi)容為:"?+?requestText);

intent.putExtras(bundle);

setResult(RESULT_OK,?intent);

finish();

}

});

}

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

二、關(guān)于Activity啟動(dòng)模式的補(bǔ)充說(shuō)明

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

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

如果以在AndroidManifest中聲明屬性的方式來(lái)設(shè)定啟動(dòng)模式的話,如果不指定taskAffinity屬性,該Acitvity只會(huì)存在于當(dāng)前棧中

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

android:name=".Main2Activity"

android:launchMode="singleTask"

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

注意,taskAffinity的值不能與包名相同,不然就相當(dāng)于沒(méi)有設(shè)置了

可以通過(guò)getTaskId()方法來(lái)查看當(dāng)前Activity位于哪個(gè)棧,如:@Override

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

setContentView(R.layout.activity_main);

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

}singleInstance

即單實(shí)例模式

采用此種模式的Activity均會(huì)獨(dú)立存在于一個(gè)棧內(nèi),即使兩個(gè)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

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

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

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

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

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

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

在 < intent-filter >中可以聲明多個(gè)action,只要求Intent中攜帶的action字符串與其中一個(gè)相同即成功匹配該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);

}

這樣依然可以成功啟動(dòng)Activitycategory

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

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

需要注意的是,系統(tǒng)在startActivity(Intent intent)的時(shí)候,會(huì)自動(dòng)為Intent添加一個(gè)默認(rèn)的category值,即:android.intent.category.DEFAULT

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

如上述代碼所示data

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

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

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

startActivity(intent);

如果過(guò)濾規(guī)則中設(shè)置了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,默認(rèn)值為(content和file)

host:URI的主機(jī)名,比如www.baidu.com

port:URI的端口號(hào)

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

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

則可以通過(guò)設(shè)置mimeType屬性來(lái)啟動(dòng)該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設(shè)置完整的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);

}

此外,由于通過(guò)隱式調(diào)用有可能因?yàn)槠ヅ洳怀晒Χ鴮?dǎo)致報(bào)錯(cuò),所以在調(diào)用之前可以先判斷當(dāng)前是否有合適的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方法就會(huì)返回null,否則就會(huì)返回匹配度最高的Activity信息

作者:leavesC

總結(jié)

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

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