在 Android 學習的過程當中,常常須要針對某些項目來寫一些測試的例子,或者在作一些 demo 的時候,都須要先寫 Activity 而後註冊。
若是裏面有太多的跳轉的話,還須要每一個跳轉都增長一個事件。這些都是很是繁瑣的步驟。那麼如何省略這些步驟呢?java
有一種辦法就是使用 Fragment,而後按照「約定大於配置」的原則,遍歷安裝包下符合條件的 Fragment 而後自動構建目錄索引與跳轉動做。
通俗來說,就是把 APK 裏面的包結構文件當作樹形結構的文件夾來處理,而後構建一個文件瀏覽器。固然,咱們構建的「類瀏覽器」。android
一個完整的實現請參考 https://github.com/xesam/AndroidQuickDemogit
PS:AndroidQuickDemo 同時增長了 Activity 的支持,可是因爲 Android 系統的限制,Activity必須被註冊,這一點是沒法繞過去的。
固然,也可使用插件的原理,達到自動索引 Activity 的目的,不過,在個人實際使用中,當必定要使用 Activity 的時候,確定是爲了使用或者探究 Activity 的直接效果,而不該該進行代理或者攔截。github
compile 'dev.xesam.android:quick-demo-creator:0.2.0'
如今支持兩種模式:瀏覽器
這個方式只是使用一個列表簡單列出全部的已註冊 Activity,而後點擊便可打開。app
用法:ide
QuickDemo.inflateActivity(activity, R.id.listview);
我的比較推薦這種用法,直接構建完整的「類瀏覽器」。學習
lib工程裏面已經內置了一個 QuickDemoActivity,你只須要在你的 Android 項目中的 AndroidManifest.xml 中註冊這個 Activity,並設置爲 LAUNCHER Activity 便可測試
<activity android:name="dev.xesam.android.quickdemo.QuickDemoActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
若是你不想使用內置的 QuickDemoActivity,那麼也能夠在本身的 Activity 中來顯示目錄,只須要提供一個 container view id 就能夠了,示例以下:ui
public class MyManActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); QuickDemo.inflateActivity(this, R.id.lv); } }
默認的目錄索引只會顯示當前 PackageName 下名稱中包含 "demo 或者 sample 或者 example"的 Activity 或者 Fragment,
若是想按照本身的規則來定義過濾,能夠自定義 QuickDemoFilter,一個示例以下:
public class CustomFilter implements QuickDemoFilter { Pattern target = Pattern.compile("demo|sample|example", Pattern.CASE_INSENSITIVE); String pkgName; public CustomFilter(Context context) { pkgName = context.getPackageName(); } @Override public boolean filter(String className) { String[] comps = className.split("\\."); String simpleClassName = comps[comps.length - 1]; return className.startsWith(pkgName) && target.matcher(simpleClassName).find() && simpleClassName.indexOf("$") == -1; } }
而後在對應的 Activity 中:
public class MyManActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); QuickDemo.inflateDemo(this, R.id.quick_demo_root, new CustomFilter(this)); } }