package com.anyun.exam.lib; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.support.annotation.Nullable; import android.util.Log; import java.util.concurrent.atomic.AtomicBoolean; /** * MyApplication2 * Created by lzw on 2019/6/5. 13:22:46 * 邮箱:632393724@qq.com * All Rights Saved! Chongqing AnYun Tech co. LTD */ public class RemoteService extends Service { private static final String TAG = "RemoteService"; /**服务是否销毁标志*/ private AtomicBoolean mIsServiceDestroyed = new AtomicBoolean(false); private RemoteCallbackList mListenerList = new RemoteCallbackList(); private IListenerInterface mListener; private int msgId = 0; private IRemoteInterface.Stub iRemoteInterface = new IRemoteInterface.Stub(){ @Override public void registListener(IListenerInterface i) throws RemoteException { //注册回调方法 mListenerList.register(i); } @Override public void unRegistListener(IListenerInterface i) throws RemoteException { mListenerList.unregister(i); } @Override public void add() throws RemoteException { Log.i(TAG,"客户端调用服务端方法"); } }; @Nullable @Override public IBinder onBind(Intent intent) { return iRemoteInterface; } @Override public void onCreate() { super.onCreate(); Log.i(TAG,"onCreate()"); new Thread(new Worker()).start(); } private class Worker implements Runnable{ @Override public void run() { while (!mIsServiceDestroyed.get()){ try { Thread.sleep(4*1000); } catch (InterruptedException e) { e.printStackTrace(); } onMessageArrived(String.format("消息ID:%d,请注意查收",msgId++)); } } } @Override public void onDestroy() { super.onDestroy(); Log.i(TAG,"onDestroy"); mIsServiceDestroyed.set(true); } private void onMessageArrived(String json){ int N = mListenerList.getRegisteredCallbackCount(); for (int i = 0; i < N; i++) { mListenerList.beginBroadcast(); mListener = mListenerList.getBroadcastItem(i); if (mListener != null){ try { mListener.onMessageArrived(json); } catch (RemoteException e) { e.printStackTrace(); } } mListenerList.finishBroadcast(); } } }