Service和Fragment之間的通信及消息監聽
前言
有些日子沒寫博客了,是因爲我太忙了嗎,不,不是這樣的,我就是單純的變懶了。
好了,言歸正傳。在開發中做消息推送之類的及時性比較長的項目時,我們常常會在項目中開一個service,在服務中開啓一個socket和服務器保持長連接,服務器一旦有消息就將數據發送到客戶端中的service中,這個時候我們就需要service和activity或者fragment之間的通訊了。
在網上搜索到的答案大部分都是在跳轉或者開啓的時候使用intent傳遞,也有一些方案是使用數據庫或者文件在組件之間傳遞數據,但是這些方案都不夠靈活,activity或者fragment中不能實時的監聽到service中數據的變化。因此我在之前的項目中使用回調來解決service和activity之間的通訊問題,同理,在service和fragment之間通訊也是一樣的。
上代碼
首先創建一個接口ServiceCallBack,在接口中創建一個沒有返回值的方法callback(String str)
package com.dimanche.test;
public interface ServiceCallBack {
public void callback(String str);
}
然後創建一個service,在service裏開啓一個線程,這個線程每隔5秒向Handler中發送一次消息,模仿service從服務器中獲取到新的消息向fragment發送消息,在這裏聲明ServiceCallBack 時一定要用static修飾,不然serviceCallBack會一直爲空
package com.dimanche.test;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.annotation.Nullable;
import android.util.Log;
public class MyService extends Service {
private MyThread myThread;
static ServiceCallBack serviceCallBack;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.e("Handler", "111");
if (serviceCallBack != null) {
Log.e("MyService", "我從山中來,種着蘭花草");
serviceCallBack.callback("我從山中來,種着蘭花草");
}
}
};
@Override
public void onCreate() {
super.onCreate();
myThread = new MyThread();
myThread.start();
}
//註冊回調函數
public void setCallBack(ServiceCallBack serviceCallBack) {
this.serviceCallBack = serviceCallBack;
Log.e("MyService", "回調註冊成功");
}
class MyThread extends Thread {
@Override
public void run() {
super.run();
while (true) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(1);
}
}
}
}
3、創建一個fragment,讓fragment實現ServiceCallBack接口,在callback方法中的參數就是service中發送過來的字符串
package com.dimanche.test;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
public class MyFragment extends Fragment implements ServiceCallBack {
MyService myService;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_my, container, false);
Log.e("MyFragment","onCreate");
myService = new MyService();
myService.setCallBack(this);
return view;
}
@Override
public void callback(String str) {
Log.e("MyFragment",str);
Toast.makeText(getActivity(), str, Toast.LENGTH_SHORT).show();
}
}
最後,在activity中加載fragment,開啓service,還有就是service莫要忘了在清單文件中註冊
getSupportFragmentManager().beginTransaction().add(R.id.framelayout, new MyFragment()).commit();
startService(new Intent(MainActivity.this, MyService.class));
最後查看效果
結語
嗯,當然還可以用一些其他的開源框架,具體的沒研究,有空再說吧
如果哪裏有誤還煩請指正呀
點擊這裏獲取找到我,獲取更多哦
QQ羣:
微信公衆號
分享小知識,記錄你的小故事呀