Activity雖然是一個java類,可是它并不能new 一個Activity
所以,Activity看上去并不是一個普通的類,它做一些事情的時候需要特殊處理
大家用的最多就是View與Activity之間的回調,非常好用
view可以直接獲取到他的對象,所以建立回調關系也是十分容易的
究竟Activity與Activity之間能否建立回調關系呢?
答案是可以的,只是Activity需要跨出它的受限范圍,思想走到更Activity更前面的一層
這里想到了使用Application
Application在一個進程中是唯一的,也是眾多Activity的“爸爸”,“爸爸”當然可以管理關于兒子的一切
這里不畫圖了,看看代碼,自己理清思路,最好能做到舉一反三
比如現有這樣一個情景,從個人主頁跳轉到登錄界面,當登錄結束后個人主頁需要監聽是否登錄成功,并根據結果相應UI。
一般都會說,重寫onResume()不就行了嗎,或者startActivityForResule()處理一下就好了嘛。
這種方法當然可以,這里這樣做,第一是舉一個例子,第二是對比一下區別。
UserActivity(用戶詳情界面)
LoginActivity(登錄界面)
IFun(定義的接口,ps,需要監聽LoginActivity做哪些事情)
UserUtils(登錄相關的工具類,這個工具類需要放在Application中全局共享,保證當前進程中所有Activity都可以訪問的到)
前方高能
下面貼出代碼
1.先定義接口
public interfaceIFun {
public voidlogin(String s);
public voidoutLogin(String s);
public voidregister(String s);
}
2.實現工具類
public classUserUtils {
privateIFuniFun;
publicUserUtils(){}
public voidsetiFun(IFun iFun) {
this.iFun= iFun;
}
public voidlogin(String s){
if(iFun==null)return;
iFun.login(s);
}
public voidoutLogin(String s){
if(iFun==null)return;
iFun.outLogin(s);
}
public voidregister(String s){
if(iFun==null)return;
iFun.register(s);
}
}
3.重寫Application
public classBaseApplicationextendsApplication {
privateUserUtilsuserUtils;
@Override
public voidonCreate() {
super.onCreate();
userUtils=newUserUtils();
}
publicUserUtilsgetUserUtils() {
returnuserUtils;
}
}
4.編寫UserInfoActivity
public classUserInfoActivityextendsActivityimplementsIFun {
TextViewtextView;
@Override
protected voidonCreate(@NullableBundle savedInstanceState) {
super.onCreate(savedInstanceState);
textView=newTextView(this);
textView.setBackgroundColor(Color.parseColor("#FFC0CB"));
textView.setGravity(Gravity.CENTER);
textView.setText("我是UserInfoActivity\n點擊任意地方跳轉");
textView.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View view) {
startActivity(newIntent(UserInfoActivity.this,LoginActivity.class));
}
});
setContentView(textView);
((BaseApplication)getApplication()).getUserUtils().setiFun(this);
}
@Override
public voidlogin(String s) {
textView.setText(s);
}
@Override
public voidoutLogin(String s) {
textView.setText(s);
}
@Override
public voidregister(String s) {
textView.setText(s);
}
}
5.編寫LoginAvtivity
public classLoginActivityextendsActivityimplementsView.OnClickListener {
privateButtonloginBtn,outLoginBtn,registerBtn;
privateUserUtilsuserUtils;
@Override
protected voidonCreate(@NullableBundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loging_activity);
loginBtn= findViewById(R.id.loginBtn);
outLoginBtn= findViewById(R.id.outLoginBtn);
registerBtn= findViewById(R.id.registerBtn);
loginBtn.setOnClickListener(this);
outLoginBtn.setOnClickListener(this);
registerBtn.setOnClickListener(this);
userUtils= ((BaseApplication)getApplication()).getUserUtils();
}
@Override
public voidonClick(View view) {
switch(view.getId()){
caseR.id.loginBtn:
userUtils.login("登錄了");
break;
caseR.id.outLoginBtn:
userUtils.outLogin("退出登錄了");
break;
caseR.id.registerBtn:
userUtils.register("我注冊了");
break;
}
finish();
}
}
好了,到這里就大功告成了。
這個原理同樣適用于Fragment中
一對多可以可以實現的
代碼:http://download.csdn.net/download/qq_33445600/9980891