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 · 访问量 3638

猜你喜欢

转载自blog.csdn.net/u011065084/article/details/104053475
今日推荐