需求:
一个手机中只能启动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>