赞
踩
@Single可以实现单例模式,但是是局部单例。因为@Single的范围取决于@Compenent,也就是注射器。而通常情况下只能创建多个@Component。所以需要采用别的方式。
首先:
@Singleton
@Component(modules = ShangjiaModule.class)
public interface Platform{
ZhaiNan waimai();
void waimai2(MainActivity mainActivity);
void waimai2(Main3Activity main3Activity);
}
@Module public class ShangjiaModule { @Provides @BaoZi1 public Baozi provideBaozi() { return new Baozi("豆沙包"); } @Provides @Singleton public Noodle provideNoodle() { return new Noodle(); } @Provides @Singleton public Apple provideApple() { return new Apple(); } @Provides @Named("doushabao2") public Baozi provideBaozi2() { return new Baozi("豆沙包2"); } }
步骤1:
public class App extends Application {
Platform platform;
@Override
public void onCreate() {
super.onCreate();
platform = DaggerPlatform.builder().build();
}
public static App get(Context context){
return (App)context.getApplicationContext();
}
public Platform getPlatform(){
return platform;
}
}
步骤2:
修改AndroidManifest.xml
<application
android:name=".App"
.../>
</application>
步骤1和2的作用参见:
Android Context完全解析,你所不知道的Context的各种细节
主要是为了应用启动时,初始化自定义的Application也就是App。这样就可以调用其中的onCreate()方法,然后生成Platform platform供其他类使用。而且latform只有一个。
最后:
MainActivity.java
public class MainActivity extends AppCompatActivity { @BindView(R.id.b1) Button b1; @Inject Apple apple1; @Inject Apple apple2; Platform platform = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); ButterKnife.bind(MainActivity.this); platform = App.get(this).getPlatform(); //重点在这(得到单例的Platform,也就是单例的Component) platform.waimai2(this); b1.setText(apple1.hashCode() + "," + apple2.hashCode()); } @OnClick(R.id.b1) public void onclick() { Toast.makeText(MainActivity.this, student.name, Toast.LENGTH_LONG).show(); Intent intent = new Intent(MainActivity.this, Main3Activity.class); startActivity(intent); } }
Main2Activity.java
public class Main2Activity extends AppCompatActivity { @BindView(R.id.b1) Button b1; @Inject Apple apple1; @Inject Apple apple2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); ButterKnife.bind(this); Platform platform = App.get(this).getPlatform(); //重点在这(得到单例的Platform,也就是单例的Component) ZhaiNan zhaiNan = platform.waimai(); platform.waimai2(this); b1.setText(apple1.hashCode() + "," + apple2.hashCode()); } }
我们要做一个应用肯定要用到很多的Component,一般的划分规则就是有一个全局的Component,比如AppComponent。每个界面有一个Component,比如一个Activity定义一个Component,一个Fragment定义一个Component。
为了管理这些Component,就可以使用自定义Scope注解,它可以更好地管理Component和Module之间的匹配关系。
而且自定义注解也很方便使用:毕竟下面就是@Single的源码
@Scope
@Documented
@Retention(RUNTIME)
public @interface Singleton {}
依葫芦画瓢:
@Scope
@Documented
@Retention(RUNTIME)
public @interface XXXScope {}
也是可以的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。