三种Service:应用内不可交互,可交互,应用间可交互(客户端,服务端AIDL)
客户端MainActivity:
public class MainActivity extends Activity {
private Button button_one;
private Button button_two;
private Button button_three;
private Button button_fore;
private Button button_five;
private Button button_one_stop;
private Button button_two_stop;
// 应用内不可交互的service,适合做后台服务,如网络下载(用户通过Intent传入Url到Service,推荐使用IntentService).
private Intent myServiceIntent = null;
// 应用内通信,如音乐播放器,在服务中控制播放器的播放、暂停、停止,在Activity中通过对服务操作控制播放器。
private BindServiceTest bindService;
private Intent myBindServiceIntent = null;
private ServiceConnection con = new ServiceConnection() {
/**
* 服务所在进程被kill或是crash时系统调用,而不是unbindService时调用
*/
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(getApplicationContext(), "BindServiceTest Service disconnect",Toast.LENGTH_SHORT).show();
}
/**
* 服务连接时调用,若已经连接不进行调用
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
bindService = ((MyBinder) service).getService();
Toast.makeText(getApplicationContext(), "BindServiceTest Service Connect",Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(),
"bindService.increaseCount======"
+ bindService.increaseCount(),Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "bindService.getCount();======" + bindService.getCount(),Toast.LENGTH_SHORT).show();
}
};
private MyAIDLInterface binder2 = null;
private Intent myAIDLServiceIntent;
private ServiceConnection con2 = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder2 = MyAIDLInterface.Stub.asInterface(service);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button_one = (Button) findViewById(R.id.service_one);
button_two = (Button) findViewById(R.id.service_two);
button_three = (Button) findViewById(R.id.service_three);
button_fore = (Button) findViewById(R.id.service_fore);
button_five = (Button) findViewById(R.id.service_five);
button_one_stop = (Button) findViewById(R.id.service_one_stop);
button_two_stop = (Button) findViewById(R.id.service_two_stop);
myServiceIntent = new Intent(this, MyService.class);
myBindServiceIntent = new Intent(this, BindServiceTest.class);
myAIDLServiceIntent = new Intent(
"com.trinea.android.demo.remote.MyAIDLServiceAction");
// 启动不可交互的service
button_one.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startService(myServiceIntent);
}
});
button_one_stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 停止不可交互service
stopService(myServiceIntent);
}
});
// 启动应用内可交互的service
button_two.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
bindService(myBindServiceIntent, con,
MainActivity.this.BIND_AUTO_CREATE);
}
});
button_two_stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 停止可交互service
if (bindService != null) {
unbindService(con);
bindService = null;
}
}
});
// 启动应用间可交互的service
button_three.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 服务绑定
boolean result = bindService(myAIDLServiceIntent, con2,
Context.BIND_AUTO_CREATE);
if (!result) {
binder2 = null;
Toast.makeText(getApplicationContext(), "服务绑定失败。",
Toast.LENGTH_SHORT).show();
}
}
});
// 得到应用间服务中属性值
button_fore.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
if (binder2 != null) {
Toast.makeText(getApplicationContext(),
"Service count:" + binder2.getCount(),
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "请先绑定服务。",
Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
// TODO: handle exception
}
}
});
// 解除应用间绑定服务。
button_five.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (binder2 != null) {
unbindService(con2);
binder2 = null;
}
}
});
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
}
不可交互Service:
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this, "Service Create", Toast.LENGTH_SHORT).show();
}
@Override
public void onDestroy() {
Toast.makeText(this, "Service Destroty", Toast.LENGTH_SHORT).show();
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Service Start", Toast.LENGTH_SHORT).show();
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
应用内可交互Service:
public class BindServiceTest extends Service {
private int count;
private MyBinder myBinder = new MyBinder();
@Override
public void onCreate() {
Toast.makeText(getApplicationContext(),"BindServiceTest Service onCreate",Toast.LENGTH_SHORT).show();
count = 0;
super.onCreate();
}
@Override
public void onDestroy() {
Toast.makeText(getApplicationContext(),"BindServiceTest Service onDestroy",Toast.LENGTH_SHORT).show();
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
/**
* 服务被绑定时调用
* 返回值用于让调用者和服务通信,传入ServiceConnection的public void onServiceConnected(ComponentName name, IBinder service)函数第二个参数
*/
@Override
public IBinder onBind(Intent intent) {
return myBinder;
}
public int getCount() {
return count;
}
public int increaseCount() {
return ++count;
}
public int decreaseCount() {
return --count;
}
public class MyBinder extends Binder {
BindServiceTest getService() {
return BindServiceTest.this;
}
}
}
应用间可交互AIDL:
package com.example.aidlservice;
interface MyAIDLInterface {
int getCount();
void setCount(int count);
}
应用间可交互service
服务端AIDL
package com.example.aidlservice;
interface MyAIDLInterface {
int getCount();
void setCount(int count);
}
服务端service:
package com.example.aidlservice;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast;
public class MyAIDLService extends Service {
private int mCount;
private MyAIDLInterface.Stub myBinder = new MyAIDLInterface.Stub() {
@Override
public void setCount(int count) throws RemoteException {
mCount = count;
}
@Override
public int getCount() throws RemoteException {
return mCount;
}
};
@Override
public void onCreate() {
mCount = 0;
Toast.makeText(getApplicationContext(), "MyAIDLService onCreate",Toast.LENGTH_SHORT).show();
super.onCreate();
}
@Override
public void onDestroy() {
Toast.makeText(getApplicationContext(), "MyAIDLService onDestroy",Toast.LENGTH_SHORT).show();
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(getApplicationContext(),Integer.toString(mCount),Toast.LENGTH_SHORT).show();
return super.onStartCommand(intent, flags, startId);
}
public int getCount() {
return mCount;
}
/**
* 服务被绑定时调用 返回值用于让调用者和服务通信,传入ServiceConnection的public void
* onServiceConnected(ComponentName name, IBinder service)函数第二个参数
*/
@Override
public IBinder onBind(Intent intent) {
return myBinder;
}
}