AyoActivityNoManifestActivity 代理框架
1 這是什么?
這個(gè)庫(kù)提供了:
一個(gè)輕量級(jí)的Activity代理框架(ActivityAttacher,使用方式基本和Activity一樣),目的在于不必在Manifest反復(fù)聲明Activity
同時(shí)提供了一個(gè)輕量級(jí)的Bundle機(jī)制(SimpleBundle,使用方式基本和Bundle一樣),目的在于在Activity之間傳遞參數(shù)時(shí)考慮序列化問(wèn)題,適用于進(jìn)程內(nèi)通信
提供了一個(gè)輕量級(jí)的OnActivityResult機(jī)制(OnResultCallback,使用方式基本和OnActivity不一樣)
狀態(tài)欄一體化的簡(jiǎn)單封裝
Activity和Fragment狀態(tài)保存的問(wèn)題
其他Activity和Fragment問(wèn)題的解決方案,后期一個(gè)一個(gè)加
2 ActivityAttacher的使用
(1) manifest
manifest里只需要聲明:
主Activity
有特殊需求的Activity,如支持旋轉(zhuǎn)
模板Activity,暫時(shí)只支持一個(gè)啟動(dòng)模式對(duì)應(yīng)一個(gè)模板Activity
模板Activity有幾個(gè)默認(rèn)配置項(xiàng),如果需要更改,也需要聲明自己的Activity
Manifest中的聲明:
<activity android:name="com.cowthan.sample.MainActivity" android:configChanges="orientation|screenSize|keyboardHidden|navigation" android:screenOrientation="portrait" android:theme="@style/AppTheme" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="org.ayo.app.base.TmplActivityStandard" android:configChanges="orientation|screenSize|keyboardHidden|navigation" android:screenOrientation="portrait" android:launchMode="standard" android:theme="@style/AyoTransparentTheme" /> <activity android:name="org.ayo.app.base.TmplActivitySingleTask" android:configChanges="orientation|screenSize|keyboardHidden|navigation" android:screenOrientation="portrait" android:launchMode="singleTask" android:theme="@style/AyoTransparentTheme" /> <activity android:name="org.ayo.app.base.TmplActivitySingleTop" android:configChanges="orientation|screenSize|keyboardHidden|navigation" android:screenOrientation="portrait" android:launchMode="singleTop" android:theme="@style/AyoTransparentTheme" /> <activity android:name="org.ayo.app.base.TmplActivitySingleInstance" android:configChanges="orientation|screenSize|keyboardHidden|navigation" android:screenOrientation="portrait" android:launchMode="singleInstance" android:theme="@style/AyoTransparentTheme" />
(2) ActivityAttacher
ActivityAttacher的意義:
ActivityAttacher就是附著在上面4個(gè)模板Activity里的Activity代理
ActivityAttacher中持有一個(gè)Activity實(shí)例對(duì)象,是在onCreate時(shí)賦值的
ActivityAttacher可以處理Activity中的所有配置和生命周期
ActivityAttacher提供的接口,原則上應(yīng)該完全仿Activity,這一點(diǎn)類似v7源碼中的和AppCompactActivity相關(guān)的一個(gè)delegate類,但不知道這個(gè)類是干什么用的
(3) 定義Activity
看代碼,這兩個(gè)只有基類不一樣,內(nèi)部代碼應(yīng)該是一樣的,其中繼承AyoActivity的是一個(gè)普通Activity,需要去manifest聲明, 而繼承AyoActivityAttacher,就不需要再去manifest聲明了
public class SampleActivity extends AyoActivityAttacher{
public static void start(Context c, boolean takeSystemBar, int lanuchMode, OnResultCallBack callBack){
SimpleBundle sb = new SimpleBundle();
sb.putExtra("takeSystemBar", takeSystemBar);
ActivityAttacher.startActivity(c, SampleActivity.class, sb, false, lanuchMode, callBack);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_tmpl);
}
}
public class SampleActivity extends AyoActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_tmpl);
}
}
(4) 啟動(dòng)ActivityAttacher
啟動(dòng)方式變成這樣:
public static void start(Context c, boolean takeSystemBar, int lanuchMode, OnResultCallBack callBack){
SimpleBundle sb = new SimpleBundle();
sb.putExtra("takeSystemBar", takeSystemBar);
ActivityAttacher.startActivity(c, SampleActivity.class, sb, false, lanuchMode, callBack);
}
SimpleBundle:功能類似于intent或者bundle,存的是傳到下一個(gè)Activity的參數(shù)
取出參數(shù):
boolean takeSystemBar = getIntent().getBooleanExtra("takeSystemBar");這里,在Activity之間傳的都是引用,不再需要考慮序列化問(wèn)題,當(dāng)然只適用于app單進(jìn)程內(nèi)
OnResultCallBack是接收Activity的回傳結(jié)果
如何回傳:
getResultCallback().onResult("代替OnActivityReslt和setResult"); finish();lanuchMode是選擇Activity的啟動(dòng)模式,也就是選擇模板:
ActivityAttacher.LAUNCH_MODE_STANDARD
ActivityAttacher.LAUNCH_MODE_SINGLE_TASK
ActivityAttacher.LAUNCH_MODE_SINGLE_TOP
ActivityAttacher.LAUNCH_MODE_SINGLE_INSTANCE
(5) Activity主題
這里提供了兩個(gè)主題:AyoTransparentTheme和AyoTheme,沒(méi)啥特殊的
