Service学习
Service可以理解为一个看不见的Activity,它分为两种,一种是本地service,说一些注意事项:
1、一种是远程service,同时调用了startservice()和bindservice()启动服务时,要同时调用stopservcie()和unbindservice(),否则服务不会停止。
2、在调用unbindservice时需要传入参数ServiceConnection,这个参数和bindService里的传进的ServiceConnection要一致,所以ServiceConnection的生命周期能覆盖这两个方法(一般声明为成员变量)
3、使用AIDL跨进程通信的几点注意事项
(1)建立AIDL文件后,需要build->make project来产生相应的.class文件
(2)客户端和服务端要有相同的AIDL文件,且本地AIDL文件所在包名要和服务端中AIDL所在包名相同
(3)在本地用Intent启动服务时要注意,还要调用intent.setPackage(“AIDL包名”)的方法,否则会报错 Service Intent must be explicit:这个方法好像在5.0以前不调用就不会错
(4)AIDL传递复杂对象时注意接口写法,这里不做详细解说了
下面赋代码吧,也好有图有真相
先来了本地的Service
首先是MainActivity.class
public class MainActivity extends ActionBarActivity implements View.OnClickListener {
private Button start;
private Button bind;
private Button cancelbind;
private Button cancelstart;
ServiceConnection sc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sample_main);
start=(Button)findViewById(R.id.start);
start.setOnClickListener(this);
bind=(Button)findViewById(R.id.bind);
bind.setOnClickListener(this);
cancelbind=(Button)findViewById(R.id.cancelbind);
cancelbind.setOnClickListener(this);
cancelstart=(Button)findViewById(R.id.cancelstart);
cancelstart.setOnClickListener(this);
sc=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MyService ms=((MyService.Localbinder)service).getService();
ms.HellowWorld(MainActivity.this);
}
@Override
public void onServiceDisconnected(ComponentName name) {
System.out.println("service onservicedisconneccted");
}
};
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
Intent i=new Intent(this.getApplicationContext(),MyService.class);
switch(v.getId()){
case R.id.start:
startService(i);
break;
case R.id.bind:
Intent j=new Intent(this,MyService.class);
bindService(j,sc, Context.BIND_AUTO_CREATE);
break;
case R.id.cancelstart:
stopService(i);
break;
case R.id.cancelbind:
unbindService(sc);
break;
}
}
}
然后是Service
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
System.out.println("service onbind");
return new Localbinder();
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("service oncreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("service onstartcommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("service onunbind");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
System.out.println("service ondestroy");
super.onDestroy();
}
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
System.out.println("service rebind");
}
public void HellowWorld(Context context)
{
Toast.makeText(context,"HellowWorld",Toast.LENGTH_SHORT).show();
}
public class Localbinder extends Binder {
MyService getService(){
return MyService.this;
}
}
}
当然不要忘记在配置文件里声明service
二、AIDL通信
首先是服务端
1AIDL文件
interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void printInformation();
}
2、MyService
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return stub;
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
}
private IMyAidlInterface.Stub stub=new IMyAidlInterface.Stub() {
@Override
public void printInformation() throws RemoteException {
System.out.println("跨进程通信");
}
};
}
二、本地端
public class MainActivity extends ActionBarActivity implements View.OnClickListener {
private Button start;
private Button bind;
private Button stopservice;
private Button unbind;
private ServiceConnection sc;
private IMyAidlInterface aidlservice;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start=(Button)findViewById(R.id.start);
start.setOnClickListener(this);
bind=(Button)findViewById(R.id.bind);
bind.setOnClickListener(this);
stopservice=(Button)findViewById(R.id.cancelstart);
stopservice.setOnClickListener(this);
unbind=(Button)findViewById(R.id.cancelbind);
unbind.setOnClickListener(this);
sc=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
aidlservice=IMyAidlInterface.Stub.asInterface(service);
try {
aidlservice.printInformation();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
switch(v.getId())
{
case R.id.start:
break;
case R.id.bind:
Intent i=new Intent("demo.haoxuan.com.remoteservice.myservice");
i.setPackage("demo.haoxuan.com.remoteservice");
bindService(i,sc, Context.BIND_AUTO_CREATE);
break;
case R.id.cancelstart:
break;
case R.id.cancelbind:
unbindService(sc);
break;
}
}