Android 實現Activity動態跳轉

在我們寫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文件下加入對應的過濾條件即可。

發佈了8 篇原創文章 · 獲贊 5 · 訪問量 6846
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章