@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 {}
也是可以的。