public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void operate(View v){
switch (v.getId()){
case R.id.start:
//启动服务(创建oncreate、启动onstartcommand)
Intent it1=new Intent(this,MyService.class);
startService(it1);
break;
case R.id.stop://停止后销毁
Intent it2=new Intent(this,MyService.class);
stopService(it2);
break;
case R.id.bind://先创建(oncreate)才可以绑定成功
Intent it3=new Intent(this,MyService.class);
bindService(it3, conn,BIND_AUTO_CREATE);//常量。
break;
case R.id.unbind://解绑后销毁
unbindService(conn);
break;
}
}
//来源于bindService的参数
//声明解绑需要用到绑定时的 ServiceConnection 的对象 conn
//ServiceConnection 用于绑定客户端和Service
//进度监控,需要继续实现的话先解绑再绑定,实现进度监控。
private ServiceConnection conn=new ServiceConnection() {
@Override
//当客户端正常连接着服务时,执行服务的绑定操作会被调用
//和 MyService 的自定义内部类 MyBinder 相呼应进行 进度监控
//MyService中IBinder类的onBind方法的返回值(自定义内部类 MyBinder )
//作为下面参数IBinder的对象传进来
public void onServiceConnected(ComponentName name, IBinder iBinder) {
Log.e("TAG","慕课");
/*
//将参数对象 iBinder 强转为自定义内部类类型的对象用于调用 内部方法 获取进度
MyService.MyBinder mb=(MyService.MyBinder)iBinder;
int step=mb.progress();
Log.e("TAG","进度为:"+step);
*/
//AIDL
IMyAidlInterface imai=IMyAidlInterface.Stub.asInterface(iBinder);
try {
imai.getProgress();
} catch (RemoteException e) {
e.printStackTrace();
}
}
//当客户端和服务的连接丢失了
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
}
public class MyService extends Service {
private int i;
public MyService() {
}
//创建
@Override
public void onCreate() {
super.onCreate();
Log.e("tag","创建");
//开启一个线程,模拟耗时任务
new Thread(){
@Override
public void run() {
super.run();
try {
for(i=1;i<100;i++){
sleep(1000);
}
} catch (InterruptedException e) {
}
}
}.start();
}
//启动
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("tag","启动");
return super.onStartCommand(intent, flags, startId);
}
//绑定,IBinder是个接口
//Binder类调用并实现了其所有方法
/*
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
Log.e("tag","绑定");
//Binder 实现了IBinder里面的所有方法
//对于onBind方法而言,要求返回IBinder对象
//定义一个内部类,继承Binder类
return new MyBinder();
}
*/
//zi定义一个内部类,继承Binder类
class MyBinder extends Binder{
//定义自己需要的方法(实现进度监控)
public int progress(){
return i;//获取i的值
}
}
//远程绑定
@Override
public IBinder onBind(Intent intent) {
Log.e("tag","绑定");
//利用stub类,stub继承了Binder,又实现了IMyAidlInterface的方法 getprogress()
//所以在new的这个stub类里面重写这个方法getProgress(),返回的是stub
return new IMyAidlInterface.Stub() {
@Override
public void getProgress() throws RemoteException {
Log.e("TAG","当前进度:"+i);
}
};
}
//解绑
@Override
public boolean onUnbind(Intent intent) {
Log.e("tag","解绑");
return super.onUnbind(intent);
}
//摧毁
@Override
public void onDestroy() {
Log.e("tag","摧毁");
super.onDestroy();
}
}
aidl
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void operate(View v){
switch (v.getId()){
case R.id.start:
//远程启动服务
Intent intent=new Intent();
//在目标包的AndroidManifest.xml里添加一个过滤器(别名),通过寻找名字再找里面的class文件
intent.setAction("com.jinanchang.myservice");
startService(intent);
break;
case R.id.stop:
//两种写法
Intent intent1=new Intent("com.jinanchang.myservice");
stopService(intent1);
break;
case R.id.bind:
Intent intent2=new Intent("com.jinanchang.myservice");
bindService(intent2,aidlconn,BIND_AUTO_CREATE);
break;
case R.id.unbind:
Intent intent3=new Intent("com.jinanchang.myservice");
unbindService(aidlconn);
break;
}
}
//绑定
private ServiceConnection aidlconn=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder iBinder) {
//AIDL
IMyAidlInterface imai=IMyAidlInterface.Stub.asInterface(iBinder);
try {
imai.getProgress();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
}
// IMyAidlInterface.aidl
package com.jinanchang.aidlapplication;
// Declare any non-default types here with import statements
interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void getProgress();
}
// 用这个AIDL文件定义自己想做的事情,然后由ReBuild产生一个满足的java类,通过这个java类完成数据共享