guice/roboguice框架學(xué)習(xí)

框架介紹

<p> roboguice是google公司的一款依賴注入框架令境,基于guice孽亲。可以減少findviewbyid的使用和new的使用展父。</p>

使用方法

在android studio中使用

<p>在gradle中使用如下語(yǔ)句可以引入roboguice.</p>
<pre> project.dependencies {
compile 'org.roboguice:roboguice:3.+'
provided 'org.roboguice:roboblender:3.+'
}</pre>

在activity中使用

activity必須繼承RoboActivity返劲。
<pre>
public class MyActivity extends RoboActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
</pre>

綁定view
  1. 綁定contentview:@ContentView(R.layout.main)。
  2. 綁定view:@injectView(R.id.textview) TextView textview;
綁定資源

<pre>@InjectResource(R.anim.my_animation) Animation myAnimation;</pre>

綁定服務(wù)

<pre> @Inject Vibrator vibrator;
@Inject NotificationManager notificationManager;</pre>

這里的服務(wù)不是android四大組件中的服務(wù)栖茉,而是指系統(tǒng)服務(wù)篮绿。系統(tǒng)服務(wù)是Android操作系統(tǒng)Java應(yīng)用程序下層的,伴隨操作系統(tǒng)啟動(dòng)而運(yùn)行的系統(tǒng)后臺(tái)服務(wù)程序(位于Android系統(tǒng)的FrameWork層)吕漂。

綁定pojo類

pojo類是簡(jiǎn)單的java bean類亲配。
<pre>class Foo {
@Inject Bar bar;
}
class Foo{
Bar bar;
@inject Foo(Bar bar){
this.bar=bar;
}
}</pre>

單例模式
普通單例模式

<pre>
@Singleton the whole app
class Foo {
}</pre>

這種單例在整個(gè)生命周期中有效,F(xiàn)oo類不會(huì)被垃圾回收器回收惶凝,除非整個(gè)應(yīng)用結(jié)束吼虎。

Context中單例

<pre>
@ContextSingleton context
class Foo {
}
</pre>

在整個(gè)Context生命周期內(nèi)為單例,當(dāng)Context存活時(shí)苍鲜,F(xiàn)oo類不會(huì)被垃圾回收器回收思灰。

Fragment中單例

<pre>
@FragmentSingleton
public class Bar {
}
</pre>

在Fragment的整個(gè)生命周期中為單例,當(dāng)fragment不被銷毀時(shí)混滔,F(xiàn)oo類不會(huì)被垃圾回收器回收洒疚。

綁定自己的類

類:
<pre>
public interface IFoo {}
public class Foo implements IFoo {}
</pre>

在activity中注入
<pre>
public class MyActivity extends RoboActivity {
//How to tell RoboGuice to inject an instance of Foo ?
@Inject IFoo foo;
}
</pre>

在AndroidManiFest.xml中注冊(cè)
<pre>
<application ...>
<meta-data android:name="roboguice.modules"
android:value="com.example.MyModule,com.example.MyModule2" />
</application>
</pre>

創(chuàng)建module繼承自AbstractModule
<pre>
package com.example;

public class MyModule extends AbstractModule {
//a default constructor is fine for a Module

public void bind() {
    bind(IFoo.class).to(Foo.class);
}

}

public class MyModule2 extends AbstractModule {
//if your module requires a context, add a constructor that will be passed a context.
private Context context;

//with RoboGuice 3.0, the constructor for AbstractModule will use an `Application`, not a `Context`
public MyModule( Context context ) {
    this.context = context;
}

public void bind() {
    bind(IFoo.class).toInstance( new Foo(context));
}

}

</pre>

綁定intentExtra數(shù)據(jù)

<pre>
@ContentView(R.layout.activity_second)
public class SecondActivity extends RoboFragmentActivity {

@InjectExtra(value = "pull", optional = true)
String pull;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Gson gson = RoboGuice.getInjector(this).getInstance(Gson.class);
    String demoStr = gson.toJson(pull);
    Ln.d(demoStr);
}

}
</pre>

在Fragment中使用

必須繼承RoboFragment
<pre>
public class MyFragment extends RoboFragment {
// Inject your view
@InjectView(R.id.text1) TextView nameTextView;

// Inflate your view as you normally would for any fragment...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.my_layout, container, false);
}

}
</pre>

在onViewCreated方法中使用注入的view。

在service中和broadcast receiver中使用

必須繼承RoboService
<pre>
public class MyService extends RoboService {

@Inject ComputeFooModule computeFooModule;

public void onCreate() {
super.onCreate();
//All injections are available from here :
computeFooModule.setUp();
}

public int onStartCommand(Intent intent, int flags, int startId) {
computeFooModule.computeFoo();
return super.onStartCommand();
}

}
</pre>

<pre>
public class MyBroadcastReceiver extends BroadcastReceiver {

@Inject ComputeFooModule computeFooModule;

protected void handleReceive(Context context, Intent intent) {
    //All injections are available from here :
    computeFooModule.setUp().computeFoo();
    ...

}

}</pre>

綁定自定義View

<pre>
class MyView extends View {
@Inject Foo foo;
@InjectView(R.id.my_view) TextView myView;

public MyView(Context context) {
    inflate(context,R.layout.my_layout, this);
    RoboGuice.getInjector(getContext()).injectMembers(this);
    onFinishInflate();
}

public MyView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    inflate(context,R.layout.my_layout, this);
}

public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
    inflate(context,R.layout.my_layout, this);
}

@Override
public void onFinishInflate() {
    super.onFinishInflate();
    //All injections are available from here
    //in both cases of XML and programmatic creations (see below)
    myView.setText(foo.computeFoo());
}

}
</pre>

通過(guò)<pre>RoboGuice.getInjector(getContext()).injectMembers(this);</pre>來(lái)綁定view坯屿。

在ContentProvider中注入

在module中使用
<pre>
@Provides
@Named("example_authority_uri")</pre>
注釋來(lái)綁定油湖。
通過(guò)
<pre>
@Inject
@Named("example_authority_uri")
</pre>
來(lái)使用。
比如:
<pre>
public class ContentProvidersModule extends AbstractModule {
@Override
protected void configure() {
}

@Provides
@Named("example_authority_uri")
public Uri getExampleAuthorityUri() {
    return Uri.parse("content://com.example.data");
}

}
</pre>
<pre>
public class MyExampleContentProvider extends RoboContentProvider {

@Inject
@Named("example_authority_uri")
private Uri contentUri;

private UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

@Override
public boolean onCreate() {
    super.onCreate();
    uriMatcher.addURI(contentUri.getAuthority(), "foo/#", 0);
    return true;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    switch (uriMatcher.match(uri)) {
        case 0:
            // Return results of your query
            return null;
        default:
            throw new IllegalStateException("could not resolve URI: " + uri);
    }

    return null;
}

@Override
public String getType(Uri uri) {
    return null;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
    return null;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
    return 0;
}

@Override
public int update(Uri uri, ContentValues contentValues, String selection, String[] selectionArgs) {
    return 0;
}

}
</pre>

RoboGuice中的Event使用

RoboGuice中實(shí)現(xiàn)了自己的觀察者模式领跛,可以在Context中傳遞事件乏德。(不能跨Actibity傳遞事件感覺(jué)比較雞肋)
其中系統(tǒng)已經(jīng)實(shí)現(xiàn)的事件有:

  • OnActivityResultEvent

  • OnConfigurationChangedEvent

  • OnContentChangedEvent

  • OnContentViewAvailableEvent

  • OnCreateEvent

  • OnDestroyEvent

  • OnNewIntentEvent

  • OnPauseEvent

  • OnRestartEvent

  • OnResumeEvent

  • OnStartEvent

  • OnStopEvent
    通過(guò)在activity中使用如下方法可以監(jiān)聽(tīng)這些事件:
    <pre>
    public void doSomethingOnResume( @Observes OnResumeEvent onResume ) {
    Ln.d("Called doSomethingOnResume in onResume");
    }
    </pre>
    使用@Observes這個(gè)注釋來(lái)觀察這個(gè)事件。
    或者在activity中聲明一個(gè)監(jiān)聽(tīng)器來(lái)監(jiān)聽(tīng)事件
    <pre>
    public class MyActivity extends RoboActivity {
    // You must "register" your listener in the current context by injecting it.
    // Injection is commonly done here in the activity, but can also be done anywhere really.
    @Inject protected MyListener myListener;

    }

    class MyListener {

      // Any method with void return type and a single parameter with @Observes annotation
      // can be used as an event listener.  This one listens to onResume.    
      public void doSomethingOnResume( @Observes OnResumeEvent onResume ) {
          Ln.d("Called doSomethingOnResume in onResume");
      }
    

    }

</pre>

自定義事件

<pre>
public class MyOtherActivity extends RoboActivity {
// You'll need the EventManager if you want to trigger an event.
@Inject protected EventManager eventManager;

    @InjectView(R.id.buy_button) protected Button buyButton;

    protected void onCreate( Bundle savedInstanceState ) {
        super.onCreate(savedInstanceState);

        buyButton.setOnClickListener( new OnClickListener() {
            public void onClick() {
                // trigger the event
                eventManager.fire(new MyBuyEvent() );
            }
        })
    }

    // handle the buy event
    protected void handleBuy( @Observes MyBuyEvent buyEvent ) {
        Toast.makeToast(this, "You won't regret it!", Toast.LENGTH_LONG).show();
    }
}

// The event class can be anything you want
class MyBuyEvent {
    ...
}

</pre>

總結(jié)

RoboGuice作為一款依賴注入框架可以提供多種注入吠昭,比如視圖喊括、pojo類胧瓜、自定義類等。大量減少了findviewbyid和new的編寫瘾晃。
當(dāng)一個(gè)類依賴于另一個(gè)類時(shí)贷痪,需要在類中創(chuàng)建一個(gè)類的實(shí)例幻妓。當(dāng)使用了依賴注入后蹦误,所依賴的類的創(chuàng)建不在類中,而是在外部創(chuàng)建然后注入到類里面肉津。

與ButterKnife和xutils3的區(qū)別
缺點(diǎn)
  • ButterKnife和xutils3的注入支持綁定事件和在Adapter中使用强胰,但是RoboGuice不可以,這是RoboGuice最大的缺點(diǎn)妹沙。
  • Event只能在同一個(gè)Context中傳遞偶洋,感覺(jué)略雞肋。
優(yōu)點(diǎn)
  • RoboGuice可以注入資源距糖、動(dòng)畫和系統(tǒng)服務(wù)等玄窝,減少了代碼量使代碼更加簡(jiǎn)潔。
  • 依賴類的初始化不用在類中完成悍引,解耦恩脂。
  • 可以通過(guò)@single、@contextsingle趣斤、@fragmentsingle來(lái)確定作用域俩块。
  • @provide提供了強(qiáng)大的綁定類型能力。
  • 可以綁定IntentExtra中的數(shù)據(jù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浓领,一起剝皮案震驚了整個(gè)濱河市玉凯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌联贩,老刑警劉巖漫仆,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異泪幌,居然都是意外死亡歹啼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門座菠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狸眼,“玉大人,你說(shuō)我怎么就攤上這事浴滴⊥孛龋” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵升略,是天一觀的道長(zhǎng)微王。 經(jīng)常有香客問(wèn)我屡限,道長(zhǎng),這世上最難降的妖魔是什么炕倘? 我笑而不...
    開(kāi)封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任钧大,我火速辦了婚禮,結(jié)果婚禮上罩旋,老公的妹妹穿的比我還像新娘啊央。我一直安慰自己,他們只是感情好涨醋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布瓜饥。 她就那樣靜靜地躺著,像睡著了一般浴骂。 火紅的嫁衣襯著肌膚如雪乓土。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天溯警,我揣著相機(jī)與錄音趣苏,去河邊找鬼。 笑死梯轻,一個(gè)胖子當(dāng)著我的面吹牛食磕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播檩淋,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芬为,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蟀悦?” 一聲冷哼從身側(cè)響起媚朦,我...
    開(kāi)封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎日戈,沒(méi)想到半個(gè)月后询张,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浙炼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年份氧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弯屈。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜗帜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出资厉,到底是詐尸還是另有隱情厅缺,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站湘捎,受9級(jí)特大地震影響诀豁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窥妇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一舷胜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧活翩,春花似錦烹骨、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)穆趴。三九已至脸爱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間未妹,已是汗流浹背簿废。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留络它,地道東北人族檬。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像化戳,于是被迫代替她去往敵國(guó)和親单料。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理点楼,服務(wù)發(fā)現(xiàn)扫尖,斷路器,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,757評(píng)論 25 707
  • 從這段時(shí)間的時(shí)間開(kāi)銷記錄中掠廓,收獲如下: 1换怖、對(duì)工具的用法更具邏輯性。開(kāi)始系統(tǒng)的使用”愛(ài)今天“蟀瞧,同時(shí)對(duì)標(biāo)簽與目標(biāo)的定...
    彭玄霏閱讀 520評(píng)論 1 4
  • 告別了清明細(xì)雨沉颂,又迎來(lái)了春日暖陽(yáng)。一個(gè)人坐在院子里曬曬太陽(yáng)悦污,腦子里思緒萬(wàn)千沒(méi)有主線铸屉。 無(wú)聊之際一只螞蟻進(jìn)入...
    麥落閱讀 328評(píng)論 2 2
  • 北國(guó)的秋,終于還是愈來(lái)愈遠(yuǎn)了切端。 幸而彻坛,今日得償所愿。 丁酉九月,綠城西行百二十里小压,有竹林线梗,見(jiàn)長(zhǎng)壽山。山不以壽怠益,以其...
    colo木葉閱讀 184評(píng)論 0 0