Service和Fragment之間的通信及消息監聽

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羣:

image.png

微信公衆號

分享小知識,記錄你的小故事呀
微信公衆號.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章