? ? ? ?開(kāi)發(fā)人員都知道,使用隱式intent可以獲取目標(biāo)activity并以列表的形式展示。而如果想要實(shí)現(xiàn)用戶點(diǎn)擊任一列表項(xiàng)時(shí),啟動(dòng)對(duì)應(yīng)的activity,那我們就需要使用顯式intent來(lái)啟動(dòng)activity。要?jiǎng)?chuàng)建啟動(dòng)activity的顯式intent,則需要從ResolveInfo對(duì)象中獲取activity的包名與類名。這些信息可以從ResolveInfo對(duì)象的ActivityInfo中獲取。
? ? ? ?更新ActivityHolder類實(shí)施一個(gè)點(diǎn)擊看聽(tīng)器。然后,使用ActivityInfo對(duì)象中的數(shù)據(jù)信息,創(chuàng)建一個(gè)顯式intent并啟動(dòng)目標(biāo)activity,如下代碼所示。
? ? ? ?啟動(dòng)目標(biāo)activity(NerdLauncherFragment.java)
? ? ? ?...
? ? ? ?private class ActivityHolder extends RecyclerView.ViewHolder
? ? ? ?implements View.OnClickListener {
? ? ? ?private ResolveInfo mResolveInfo;
? ? ? ?private TextView mNameTextView;?
? ? ? ?public ActivityHolder(View itemView) {
? ? ? ?super(itemView);
? ? ? ?mNameTextView = (TextView) itemView;
? ? ? ?mNameTextView.setOnClickListener(this);
? ? ? ?}
? ? ? ?public void bindActivity(ResolveInfo resolveInfo) {
? ? ? ?...
? ? ? ?}
? ? ? ?@Override
? ? ? ?public void onClick(View v) {
? ? ? ?ActivityInfo activityInfo = mResolveInfo.activityInfo;
Intent i = new Intent(Intent.ACTION_MAIN)
? ? ? ?.setClassName(activityInfo.applicationInfo.packageName,
? ? ? ?activityInfo.name);
? ? ? ?startActivity(i);
? ? ? ?}
? ? ? ?}
? ? ? ?從以上代碼可以看到,作為顯式intent的一部分,我們還發(fā)送了ACTION_MAIN操作。發(fā)送的intent是否包含操作,對(duì)于大多數(shù)應(yīng)用來(lái)說(shuō)沒(méi)有什么差別。不過(guò),有些應(yīng)用的啟動(dòng)行為可能會(huì)有所不同。取決于不同的啟動(dòng)要求,同樣的activity可能會(huì)顯示不同的用戶界面。建議南昌APP開(kāi)發(fā)時(shí)先明確啟動(dòng)意圖,以便讓activity完成它應(yīng)該完成的任務(wù)。
? ? ? ?在以上代碼中,使用包名和類名創(chuàng)建顯式intent時(shí),我們使用了以下Intent方法:
? ? ? ?public Intent setClassName(String packageName, String className)
? ? ? ?這不同于以往創(chuàng)建顯式intent的方式。之前,我們使用的是接受Context和Class對(duì)象的Intent構(gòu)造方法:
? ? ? ?public Intent(Context packageContext, Class> cls)
? ? ? ?該構(gòu)造方法使用傳入的參數(shù)來(lái)獲取Intent需要的ComponentName。ComponentName由包名和類名共同組成。傳入Activity和Class創(chuàng)建Intent時(shí),構(gòu)造方法會(huì)通過(guò)Activity類自行確定全路徑包名。
? ? ? ?也可以自己通過(guò)包名和類名創(chuàng)建ComponentName,然后使用下面的Intent方法創(chuàng)建顯式intent:
? ? ? ?public Intent setComponent(ComponentName component)
? ? ? ?不過(guò),setClassName(...)方法能夠自動(dòng)創(chuàng)建組件名,所以使用該方法需要的實(shí)現(xiàn)代碼相對(duì)較少。運(yùn)行NerdLauncher應(yīng)用并嘗試啟動(dòng)一些應(yīng)用。