Service
- service是一个可以在后台执行、长时间运行而不提供用户界面的应用组件,也可为其他应用提供一些功能接口。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。所谓的后台是相对前台而言的,具体就是说不依赖于用户界面。
service不是进程,不是线程。但service运行于所在进程的主线程,它有独立的生命周期。
- 下载文件,播放音乐,购买车票 等等
private static final String TAG = "servers"; @Override public void onCreate() { super.onCreate(); Log.e(TAG, "onCreate: .................." ); } @Override public int onStartCommand(final Intent intent, int flags, int startId) { new Thread(new Runnable() { int content=0; String name=intent.getStringExtra("name"); @Override public void run() { while (content<100){ try { Thread.sleep(1000); content++; Log.e(TAG, "run:........."+content+name ); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); return super.onStartCommand(intent, flags, startId); } @Nullable @Override public IBinder onBind(Intent intent) { Log.e(TAG, "onBind: ............." ); return null; } @Override
@Override public void onClick(View view) { switch (view.getId()){ case R.id.servicestart: Intent intent=new Intent(this,servers.class); intent.putExtra("name","张三"); startService(intent); break; case R.id.servicestop: Intent intent1=new Intent(this,servers.class); stopService(intent1); break; } }
int count; private MyBinder myBinder=new MyBinder(); boolean stopFlag; private class MyBinder extends Binder{ public int getCount(){ return count; } } @Nullable @Override public IBinder onBind(Intent intent) { System.out.print("执行onBind方法"); return null; } @Override public boolean onUnbind(Intent intent) { System.out.print("执行onUnbind方法"); return super.onUnbind(intent); } @Override public void onCreate() { System.out.print("执行onCreate方法"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.print("执行onStartCommand方法"); return super.onStartCommand(intent, flags, startId); } @Override public void onRebind(Intent intent) { super.onRebind(intent); System.out.print("rebind"); } @Override public void onDestroy() { super.onDestroy(); stopFlag=true; System.out.print("执行onDestroy"); } class MyThread extends Thread{ @Override public void run() { super.run(); while (!stopFlag){ try { Thread.sleep(1000); System.out.print(Thread.currentThread().getName()+"---"+Thread.currentThread().getId()); } catch (InterruptedException e) { e.printStackTrace(); } count++; System.out.print(count); } } }
Button Myservicestart,Myservicestop; Intent intent; ServiceConnection conn=new ServiceConnection(){ @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { System.out.print("onServiceConnected"); } @Override public void onServiceDisconnected(ComponentName componentName) { System.out.print("onService"); //MyserviceTwo myserviceTwo=(Myservice.MyBinder)service.getService(); //ms.printServiceName(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_myservices); binID(); Intent intent=new Intent(this,Myservice.class); } private void binID() { Myservicestart=findViewById(R.id.Myservicestart); Myservicestop=findViewById(R.id.Myservicestop); Myservicestart.setOnClickListener(this); Myservicestop.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.Myservicestart: bindService(intent, conn, Service.BIND_AUTO_CREATE); break; case R.id.Myservicestop: unbindService(conn); break; } } @Override protected void onDestroy() { super.onDestroy(); }
- IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期,那么与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作。
- IntentService解析及使用规范
IntentService
1 创建类继承Service
public abstract class IntentService extends Service { private volatile Looper mServiceLooper; private volatile ServiceHandler mServiceHandler; private String mName; private boolean mRedelivery; private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { onHandleIntent((Intent)msg.obj); stopSelf(msg.arg1); } } public IntentService(String name) { super(); mName = name; } public void setIntentRedelivery(boolean enabled) { mRedelivery = enabled; } @Override public void onCreate() { super.onCreate(); HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.start(); mServiceLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mServiceLooper); } @Override public void onStart(@Nullable Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); } @Override public int onStartCommand(@Nullable Intent intent, int flags, int startId) { onStart(intent, startId); return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY; } @Override public void onDestroy() { mServiceLooper.quit(); } @Override @Nullable public IBinder onBind(Intent intent) { return null; } @WorkerThread protected abstract void onHandleIntent(@Nullable Intent intent); }
2 创建Service
- 在Service被创建的时候,使用HandlerThread(继承于 Thread)创建一个多线程并运行起来,使用HandlerThread线程的Looper来创建一个Handler,使得此Handler处理的所有任务都运行在非主线程里。
public void onCreate() {
public void onCreate() { super.onCreate(); HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.start(); mServiceLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mServiceLooper); }
3 处理任务
public void handleMessage(Message msg) { onHandleIntent((Intent)msg.obj); stopSelf(msg.arg1); } ----------------------------------------- @Override public void onStart(@Nullable Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); } @Override public int onStartCommand(@Nullable Intent intent, int flags, int startId) { onStart(intent, startId); return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICK; } @WorkerThread protected abstract void onHandleIntent(@Nullable Intent intent);
4 销毁Service
- 务执行完毕后会调用stopSelf,在没有任何任务正在执行或即将执行的情况下Service会停止运行.
public void handleMessage(Message msg) { onHandleIntent((Intent)msg.obj); stopSelf(msg.arg1); }
5 注意事项
- Service停止运行时要注意使用mServiceLooper.quit()退出Looper。如果不提供绑定服务默认返回null。
@Override public void onDestroy() { mServiceLooper.quit(); } @Override @Nullable public IBinder onBind(Intent intent) { return null; }
文章来源: Service