Android Service监听_两个Service之间相互监视的实现
2017-11-24 14:18:08  By: dwtedx

 在实际开发中可能需要用到两个Service相互监视的情况,本示例就是实现此功能以作参考。


服务A:

public class ServiceA extends Service {


    private static final String TAG = ServiceA.class.getSimpleName();
    MyBinder mBinder;
    MyServiceConnection mServiceConnection;
    PendingIntent mPendingIntent;

    @Override
    public void onCreate() {
        super.onCreate();

        if(mBinder==null)
        {
            mBinder=new MyBinder();
        }
        mServiceConnection=new MyServiceConnection();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        ServiceA.this.bindService(new Intent(ServiceA.this,ServiceB.class),mServiceConnection, Context.BIND_IMPORTANT);
        mPendingIntent=PendingIntent.getService(this,0,intent,0);
        Notification.Builder builder=new Notification.Builder(this);
        builder.setTicker("守护服务A启动中")
                .setContentText("我是来守护服务B的")
                .setContentTitle("守护服务A")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(mPendingIntent)
                .setWhen(System.currentTimeMillis());
        Notification notification=builder.build();

        startForeground(startId,notification);


        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    public class MyBinder extends IBridgeInterface.Stub {

        @Override
        public String getName() throws RemoteException {
            return "name:" TAG;
        }
    }

    class MyServiceConnection implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            String name=null;
            try {
                name= IBridgeInterface.Stub.asInterface(iBinder).getName();
            } catch (RemoteException e) {
                e.printStackTrace();
            }


            Toast.makeText(ServiceA.this,name "连接成功",Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Toast.makeText(ServiceA.this,TAG "断开连接",Toast.LENGTH_SHORT).show();

            ServiceA.this.startService(new Intent(ServiceA.this,ServiceB.class));

            ServiceA.this.bindService(new Intent(ServiceA.this,ServiceB.class),mServiceConnection, Context.BIND_IMPORTANT);

        }
    }


}


服务B:

public class ServiceB extends Service {

    private static final String TAG = ServiceB.class.getSimpleName();
    private PendingIntent mPendingIntent;
    private MyBinder mBinder;
    private MyServiceConnection mServiceConnection;

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        if (mBinder == null) {
            mBinder = new MyBinder();
        }

        mServiceConnection = new MyServiceConnection();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        this.bindService(new Intent(ServiceB.this, ServiceA.class), mServiceConnection, Context.BIND_IMPORTANT);
        mPendingIntent = PendingIntent.getService(this, 0, intent, 0);
        Notification.Builder builder = new Notification.Builder(this);

        builder.setTicker("守护服务B启动中")
                .setContentText("我是来守护服务A的")
                .setContentTitle("守护服务B")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(mPendingIntent)
                .setWhen(System.currentTimeMillis());
        Notification notification = builder.build();
        startForeground(startId, notification);

        return START_STICKY;
    }

    public class MyBinder extends IBridgeInterface.Stub {

        @Override
        public String getName() throws RemoteException {
            return "name:" TAG;
        }
    }

    class MyServiceConnection implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            String name=null;
            try {
                name=IBridgeInterface.Stub.asInterface(iBinder).getName();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
            Toast.makeText(ServiceB.this, name   "连接成功", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Toast.makeText(ServiceB.this, TAG   "断开连接", Toast.LENGTH_SHORT).show();

            ServiceB.this.startService(new Intent(ServiceB.this, ServiceA.class));
            ServiceB.this.bindService(new Intent(ServiceB.this, ServiceA.class), mServiceConnection, Context.BIND_IMPORTANT);
        }
    }


}


IBridgeInterface接口

interface IBridgeInterface {
    String getName();
}


界面:

public class MainActivity extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        startService(new Intent(this, ServiceA.class));
        startService(new Intent(this, ServiceB.class));
    }

}


AndroidManifest.xml

<service android:name=".services.ServiceA" />
<service
    android:name=".services.ServiceB"
    android:process=":remote" />


由于涉及到跨进程,onServiceConnected() 方法中使用

IBridgeInterface.Stub.asInterface(iBinder).getName();

而不能直接类型转换

((ServiceA.MyBinder)iBinder).getName();

 

onStartCommand

onStartCommand() 方法必须返回整型数。整型数是一个值,用于描述系统应该如何在服务终止的情况下继续运行服务。

返回的值必须是以下常量之一:

START_NOT_STICKY

如果系统在 onStartCommand() 返回后终止服务,则除非有挂起 Intent 要传递,否则系统不会重建服务。

START_STICKY

如果系统在 onStartCommand() 返回后终止服务,则会重建服务并调用 onStartCommand(),但绝对不会重新传递最后一个 Intent。相反,除非有挂起 Intent 要启动服务(在这种情况下,将传递这些 Intent ),否则系统会通过空 Intent 调用 onStartCommand()。这适用于不执行命令、但无限期运行并等待作业的媒体播放器(或类似服务)。

START_REDELIVER_INTENT

如果系统在 onStartCommand() 返回后终止服务,则会重建服务,并通过传递给服务的最后一个 Intent 调用 onStartCommand()。任何挂起 Intent 均依次传递。这适用于主动执行应该立即恢复的作业(例如下载文件)的服务。

 

若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


快速评论


技术评论

  • 该技术还没有评论、赶快抢沙发吧...
DD记账
top
+