今天学习service,其法有二。一曰start,二曰bind。
一、startService
(一)、xml
(二)、创建一个service,重写oncreate,onStartCommand,onDestroy三个方法。为了效果,我来个计时
package com.yangpeilin.servicedemo;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service {
private static final String TAG = "MyService";
private Handler handler;
int a = 0;
private Runnable runnable;
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG, "onCreate: " );
}
// start
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand: ");
handler = new Handler();
runnable = new Runnable() {
@Override
public void run() {
Log.e(TAG, "下载中——>> "+a+"%" );
a++;
handler.postDelayed(this,1000);
}
};
handler.post(runnable);
return super.onStartCommand(intent, flags, startId);
}
// start
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy: " );
handler.removeCallbacks(runnable);
super.onDestroy();
}
}
(三)、activity中为按钮设置点击事件,通过start/stop来启动和停止service
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_startService:
intent = new Intent(this,MyService.class);
startService(intent);
break;
case R.id.btn_stopService:
intent = new Intent(this,MyService.class);
stopService(intent);
break;
}
}
(四)、结果如下
二、bindService
(一)、xml
(二)、在服务中重写onCreate,onStartCommand,onBind,onUnbind,onDestroy方法。然后我们再来一个内部类继承于binder用于onbind的返回。后面可通过该类进行服务内部方法的调用
package com.yangpeilin.servicedemo;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service {
private static final String TAG = "MyService";
private Handler handler;
int a = 0;
private Runnable runnable;
public MyService() {
}
public class MyBind extends Binder{
public void MyBind(){
Log.e(TAG, "MyBind: " );
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
Log.e(TAG, "onBind: " );
return new MyBind();
}
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG, "onCreate: " );
}
@Override
public boolean onUnbind(Intent intent) {
Log.e(TAG, "onUnbind: " );
return super.onUnbind(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand: ");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy: " );
super.onDestroy();
}
// // start
// @Override
// public int onStartCommand(Intent intent, int flags, int startId) {
// Log.e(TAG, "onStartCommand: ");
// handler = new Handler();
// runnable = new Runnable() {
// @Override
// public void run() {
// Log.e(TAG, "下载中——>> "+a+"%" );
// a++;
// handler.postDelayed(this,1000);
// }
// };
// handler.post(runnable);
// return super.onStartCommand(intent, flags, startId);
// }
// // start
// @Override
// public void onDestroy() {
// Log.e(TAG, "onDestroy: " );
// handler.removeCallbacks(runnable);
// super.onDestroy();
// }
}
(三)、activity中按钮的点击事件
bindservice需要三个参数,第一个为intent。
第二个需要connection ,我们实例化一个,并实现两个方法。第一个onServiceConnected是绑定成功时,我们让我们服务中的自写的类等于service
第三个我们设为自动创建BIND_AUTO_CREATE
取消绑定时我们判断connection 不为空并且service绑定(宾德service的返回值)着的情况下通过UNbind解绑
case R.id.btn_bindService:
intent = new Intent(this,MyService.class);
connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 绑定成功
MyService.MyBind myBind = (MyService.MyBind) service;
Log.e(TAG, "onServiceConnected: " );
}
@Override
public void onServiceDisconnected(ComponentName name) {
// 取消绑定
Log.e(TAG, "onServiceDisconnected: " );
}
};
bind = bindService(intent, connection, BIND_AUTO_CREATE);
break;
case R.id.btn_unbindService:
if (connection!=null&&bind) {
unbindService(connection);
}
break;
(四)、结果
(五)、添加一个按钮实现服务内部方法调用
(1)、在服务中我们写的类中写一个方法
(2)、在服务销毁的声明周期停止该方法
(3)、在绑定成功时将我们的对象声明为全局变量
(4)、在点击事件中通过该对象调用方法。
(5)结果
注意!!!
通过绑定的方法,在不解绑的情况下直接退出应用会报错。
所以我们可以在activity的生命周期中做相对应的处理