四大组件之Service
虽然项目中Service用的不算太多 但毕竟作为Android四大组件之一 有必要一探究竟
Service
onBind //返回IBinder 通信
onCreate //第一次创建回调
onDestroy //关闭之前回调
onStartCommand //早期版本onStart startService启动时回调
onUnbind //Service上绑定都断开时回调
运行Service两种方式
startService //访问者退出 Service仍然允许
bindService //访问者退出 Service终止
生命周期
startService //onCreate onStartCommand onDestroy
bindService //onCreate onBind onUnbind onDestroy
特殊的生命周期
startService启动 bindService绑定 unbindService解除绑定 bindService再次绑定
//onCreate onStartCommand onBind onUnbind onRebind
ServiceConnection 监听访问者与Service之间连接情况
IntentService //可执行耗时任务
Service与他所在应用属于同一进程 不可执行耗时任务
Demo1 startService
public class StartServiceTest extends Activity {
Button start, stop;
Intent intent = new Intent();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initTitle();
initData();
initView();
}
public void initTitle() {
}
public void initData() {
intent.setAction("org.crazyit.service.FIRST_SERVICE");
}
public void initView() {
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.stop);
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// 启动
startService(intent);
}
});
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// 停止
stopService(intent);
}
});
}
}
public class FirstService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.i("TAG", "onCreate" + "创建");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("TAG", "onStartCommand" + "启动");
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("TAG", "onDestroy" + "关闭");
}
}
Demo2 bindService
public class BindServiceTest extends Activity implements View.OnClickListener {
Intent intent = new Intent();
Button bind, unbind, getServiceStatus;
BindService.MyBinder binder;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (BindService.MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("TAG", "onServiceDisconnected" + "断开连接");
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initTitle();
initData();
initView();
}
public void initTitle() {
}
public void initData() {
intent.setAction("org.crazyit.service.BIND_SERVICE");
}
public void initView() {
bind = (Button) findViewById(R.id.bind);
unbind = (Button) findViewById(R.id.unbind);
getServiceStatus = (Button) findViewById(R.id.getServiceStatus);
bind.setOnClickListener(this);
unbind.setOnClickListener(this);
getServiceStatus.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bind:// 绑定
bindService(intent, conn, Service.BIND_AUTO_CREATE);
break;
case R.id.unbind:// 解绑
unbindService(conn);
break;
case R.id.getServiceStatus:// 获取状态
Toast.makeText(BindServiceTest.this, "Serivce的count值为:" + binder.getCount(), Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
public class BindService extends Service {
private int count;
private boolean quit;
private MyBinder binder = new MyBinder();
public class MyBinder extends Binder {
public int getCount() {
return count;
}
}
@Override
public IBinder onBind(Intent intent) {
Log.i("TAG", "onBind" );
// 返回IBinder对象
return binder;
}
@Override
public void onCreate() {
super.onCreate();
Log.i("TAG", "onCreate" + "创建");
new Thread() {
@Override
public void run() {
while (!quit) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
count++;
}
}
}.start();
}
@Override
public boolean onUnbind(Intent intent) {
Log.i("TAG", "onUnbind");
return true;
}
@Override
public void onDestroy() {
super.onDestroy();
this.quit = true;
Log.i("TAG", "onDestroy");
}
}
Demo3 特殊生命周期 onRebind
public class ReBindServiceTest extends Activity {
BindService.MyBinder binder;
Intent intent;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("--Service Connected--");
binder = (BindService.MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
System.out.println("--Service Disconnected--");
}
};
public void start(View source) {
startService(intent);
}
public void bind(View source) {
bindService(intent, conn, Service.BIND_AUTO_CREATE);
}
public void unBind(View source) {
unbindService(conn);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
intent = new Intent();
intent.setAction("org.crazyit.service.BIND_SERVICE");
}
}
public class BindService extends Service {
private int count;
private boolean quit;
private MyBinder binder = new MyBinder();
public class MyBinder extends Binder
{
public int getCount() {
return count;
}
}
@Override
public IBinder onBind(Intent intent) {
System.out.println("Service is Binded");
return binder;
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("Service is Created");
new Thread() {
@Override
public void run() {
while (!quit) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
count++;
}
}
}.start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("Service is Started");
return START_STICKY;
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("Service is Unbinded");
return true;
}
@Override
public void onDestroy() {
super.onDestroy();
this.quit = true;
System.out.println("Service is Destroyed");
}
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
this.quit = true;
System.out.println("---Service is ReBinded---");
}
}
Demo4 IntentService
public class IntentServiceTest extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void startService(View source) {
Intent intent = new Intent(this, MyService.class);
startService(intent);
}
public void startIntentService(View source) {
Intent intent = new Intent(this, MyIntentService.class);
startService(intent);
}
}
public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
long endTime = System.currentTimeMillis() + 20 * 1000;
System.out.println("onStart");
while (System.currentTimeMillis() < endTime) {
synchronized (this) {
try {
wait(endTime - System.currentTimeMillis());
} catch (Exception e) {
}
}
}
Log.i("TAG", "onHandleIntent");
}
}
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
long endTime = System.currentTimeMillis() + 20 * 1000;
while (System.currentTimeMillis() < endTime) {
synchronized (this) {
try {
wait(endTime - System.currentTimeMillis());
} catch (Exception e) {
}
}
}
return START_STICKY;
}
}
https://github.com/huanyi0723/ServiceDemo
来源:https://www.cnblogs.com/huanyi0723/p/4997585.html