在我們寫Demo時,經常是一排按鈕,然後跳轉至對應Activity,這樣做就會出現,當我們繼續添加功能點時,不僅要在MainActivity添加按鈕,事件,這樣就會很麻煩,今天我們來使用動態跳轉來實現。
首先,我們分析下需求,到底要實現什麼樣的效果?吉德林法則告訴我們:認識到問題把難題清清楚楚地寫出來,便已經解決了一半。
1、我們希望MainActivity不要添加代碼的情況下,跳轉至新寫的頁面
分析:MainActivity不添加代碼,但是又需要新頁面的事件入口,首先我們可以想到的是ListView,數據源發生變化,試圖也會跟着發生變化。通過ListView條目點擊事件,跳轉到對應的Activity,那麼數據源必須包含Intent與item顯示相關的內容,寫demo,使用文本信息即可。如何去獲取這些信息呢?其實我們可以從Manifest去獲取!
主要代碼如下:
此類的作用:通過傳入一個過濾條件,獲取滿足條件的Activity的集合,實體Demo中包含一個String與一個Intent,String是做爲ListView條目顯示的內容,Intent是條目點擊事件需要跳轉的Activity所使用的Intent。
public class ActivityUtil {
public static List<Demo> getActivityInfo(Context context,String CATEGORY){
List<Demo> result = new ArrayList<>();
Intent intent = new Intent(Intent.ACTION_MAIN,null);
intent.addCategory(CATEGORY);
PackageManager pm = context.getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(intent,0);
for (int i = 0; i <list.size() ; i++) {
Demo demo = new Demo();
ResolveInfo info = list.get(i);
if (!context.getPackageName().equalsIgnoreCase(info.activityInfo.packageName))
continue;
CharSequence lableSeq = info.loadLabel(pm);
String lable = lableSeq!=null?lableSeq.toString():info.activityInfo.name;
Intent target = new Intent();
target.setClassName(info.activityInfo.packageName, info.activityInfo.name);
demo.setTitle(lable);
demo.setIntent(target);
result.add(demo);
}
return result;
}
}
public class Demo {
private String title;
private Intent intent;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Intent getIntent() {
return intent;
}
public void setIntent(Intent intent) {
this.intent = intent;
}
}
Activity裏面的主要代碼:
private void initListView() {
ListView listView = findViewById(R.id.listView);
demoList = getDatas();
if (demoList == null)
demoList = new ArrayList<>();
DemoAdapter demoAdapter = new DemoAdapter(this, demoList);
listView.setAdapter(demoAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
startActivity(demoList.get(position).getIntent());
}
});
}
public static final String CATEGORY_CODE = "com.example.study_app.intent.category.CATEGORY_CODE";
@Override
protected List<Demo> getDatas() {
return ActivityUtil.getActivityInfo(this,CATEGORY_CODE);
}
Manifest註冊如下:
<activity
android:name=".activity.DesignPatternActivity"
android:label="設計模式">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="com.example.study_app.intent.category.CATEGORY_CODE" />
</intent-filter>
</activity>
效果如下:
當我們繼續創建其他的Demo,只需要是註冊該Activity的Manifest文件下加入對應的過濾條件即可。