多个app连接同一个service

时间:2025-03-30 11:32:00

需求:

一个手机中只能启动service的一个实例,任意一个app启动该service前先检测是否已经有其他app启动了该service,如果已经运行则直接绑定,如果没有service的实例,则启动一个。

ShareService代码
public class ShareService extends Service {
    private static final String TAG = ();

    public static final String SERVICE_NAME = "";


    private static Handler handler;
    private static Messenger messenger;

    @Override
    public void onCreate() {
        ();
        (TAG, "Service onCreate");

        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                (TAG, "msg what=" + );
                (TAG, "msg obj=" + ((Bundle) ).getString("key"));
                int pid = ();
                (TAG, "preplyTo");
                } catch (RemoteException re) {
                    (TAG, "replyTo error", re);
                }
            }
        };
        messenger = new Messenger(handler);
    }

    @Override
    public IBinder onBind(Intent intent) {
        (TAG, "onBind");
        return ();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        (TAG, "onStartCommand");
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        (TAG, "Service onDestroy");
        ();
    }
}

app代码

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    private Messenger mService = null;
    private String packageName;
    private static Messenger messenger;
    private static Handler handler;

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

        Intent intent = new Intent();
        boolean noService = noService();
        if (noService) {
            (this, );
            startService(intent);
        } else {
            (new ComponentName(packageName, ShareService.SERVICE_NAME));
        }
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

        Button btnSendToService = (Button) findViewById(.btn_send_to_service);
        (new () {
            @Override
            public void onClick(View v) {
                Bundle bundle = new Bundle();
                ("key", "I am another");
                Message message = (null, 100, 0, 0);
                 = bundle;
                 = messenger;
                try {
                    (message);
                } catch (RemoteException re) {
                    (TAG, "send message error", re);
                }
            }
        });

        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                (TAG, "msg what=" + );
                (TAG, "msg obj=" + ((Bundle) ).getString("key"));
                int pid = ();
                (TAG, "p" + service);
            mService = new Messenger(service);
//            mBound = true;
        }

        public void onServiceDisconnected(ComponentName className) {
            // 当与service的连接意外断开时被调用-- 也就是,service的进程崩溃了
//            mService = null;
//            mBound = false;
        }
    };

    @Override
    public void onDestroy() {
        (TAG, "MainActivity onDestroy");
        ();
        unbindService(mConnection);
    }
}


service的

<manifest xmlns:andro
    package="">

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true">

        <service
            android:name=".ShareService"
            android:exported="true"
            android:process=":remote" />

    </application>

</manifest>