Android中的Service
来源:互联网 发布:装完软件蓝屏 编辑:程序博客网 时间:2024/06/05 02:22
1.Service介绍
Service是一种计算型组件,用于在后台执行一系列计算任务,服务有两种状态:启动状态和绑定状态。当服务组件处于启动状态时,Service可以在后台做一些计算,但不需要和外界有直接的交互。注意Service是运行在主线程的,所以后台耗时操作需要在子线程中完成。当Sevice处于绑定状态的时候,外界可以和Service组件进行通信。我们可以采用stopService和unBindService来停止一个服务组件。注意要在清单文件中配置服务
2.Service的生命周期
当Sevice处于启动状态时的生命周期
给出一个Service的简单实现
public class FirstService extends Service{ private static final String TAG = "FirstService"; //必须实现的方法,可以通过该对象与Service组件通信 @Override public IBinder onBind(Intent intent) { Log.e(TAG, "onBind()方法执行了"); return null; } //Service第一次创建后回调此方法 @Override public void onCreate() { super.onCreate(); Log.e(TAG, "onCreate()方法执行了"); } //每次调用startService方法时,都会调用此方法 @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e(TAG, "onStartCommand()方法执行了"); return super.onStartCommand(intent, flags, startId); } //Service被关闭时回调此方法 @Override public void onDestroy() { super.onDestroy(); Log.e(TAG, "onDestroy()方法执行了"); } //当该Service上绑定的所有客户端都断开连接时会调用该方法 @Override public boolean onUnbind(Intent intent) { Log.e(TAG, "onUnbind()方法执行了"); return super.onUnbind(intent); }}
<service android:name=".service.FirstService"/>
//开启服务的按钮 mStartButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { intent = new Intent(MainActivity.this, FirstService.class); startService(intent); } }); //停止服务的按钮 mStopButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //会调用onDestroy()方法 intent = new Intent(MainActivity.this, FirstService.class); stopService(intent); } });
当第一次开启服务的时候:
onCreate()——>onStartCommand()
截图如下:
当第二次点击开启服务的时候只会执行一个方法
onStartCommand()
截图如下:
我点击了四次,所以执行了四次onStartCommand()方法
- 当Sevice处于绑定状态时的生命周期
public class BindService extends Service{ private static final String TAG = "BindService"; private MyBinder binder = new MyBinder(); private int count; private boolean quit; public class MyBinder extends Binder { public int getCount(){ return count; } } @Override public IBinder onBind(Intent intent) { Log.e(TAG, "onBind()方法执行了"); return binder; } @Override public void onCreate() { super.onCreate(); Log.e(TAG, "onCreate()方法执行了"); new Thread() { @Override public void run() { while (!quit) { try { Thread.sleep(1000); } catch (Exception e) { } count++; } } }.start(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e(TAG, "onStartCommand()方法执行了"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.e(TAG, "onDestroy()方法执行了"); quit=true; } @Override public boolean onUnbind(Intent intent) { Log.e(TAG, "onUnbind()方法执行了"); return true; }}
private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder binder) { //服务连接 mBinder = (BindService.MyBinder) binder; } @Override public void onServiceDisconnected(ComponentName name) { //服务断开 } }; //绑定服务 mBindService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mIntent = new Intent(SecondActivity.this, BindService.class); bindService(mIntent, conn, Service.BIND_AUTO_CREATE); } }); //解除绑定 mUnbindService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(conn!=null){ unbindService(conn); } } });
当绑定Service的时候,生命周期
onCreate()——>onBind()
运行截图如下:
当解除绑定Service的时候,生命周期
onUnbind()——>onDestroy()
运行截图如下:
3.绑定Service的demo
SecondActivity.java
package service.zhoujian.com.serviceinstance.activity;import android.app.Activity;import android.app.Service;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.view.View;import android.widget.Button;import android.widget.Toast;import butterknife.ButterKnife;import butterknife.InjectView;import service.zhoujian.com.serviceinstance.R;import service.zhoujian.com.serviceinstance.service.BindService;/** * Created by zhoujian on 2016/11/10. */public class SecondActivity extends Activity { private BindService.MyBinder mBinder; private Intent mIntent; @InjectView(R.id.bind_service) Button mBindService; @InjectView(R.id.unbind_service) Button mUnbindService; @InjectView(R.id.bind_state) Button mBindState; //option+command+k 对生命周期方法进行排序 private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder binder) { //服务连接 mBinder = (BindService.MyBinder) binder; } @Override public void onServiceDisconnected(ComponentName name) { //服务断开 } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); ButterKnife.inject(this); clickEvent(); } private void clickEvent() { //绑定服务 mBindService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mIntent = new Intent(SecondActivity.this, BindService.class); bindService(mIntent, conn, Service.BIND_AUTO_CREATE); } }); //解除绑定 mUnbindService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(conn!=null){ unbindService(conn); } } }); //绑定状态 mBindState.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(mBinder!=null){ Toast.makeText(SecondActivity.this, "Service的count值为:"+mBinder.getCount(), Toast.LENGTH_SHORT).show(); } } }); } @Override protected void onRestart() { super.onRestart(); } @Override protected void onStart() { super.onStart(); } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); }}
BindService.java
package service.zhoujian.com.serviceinstance.service;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;import android.util.Log;/** * Created by zhoujian on 2016/11/10. */public class BindService extends Service{ private static final String TAG = "BindService"; private MyBinder binder = new MyBinder(); private int count; private boolean quit; public class MyBinder extends Binder { public int getCount(){ return count; } } @Override public IBinder onBind(Intent intent) { Log.e(TAG, "onBind()方法执行了"); return binder; } @Override public void onCreate() { super.onCreate(); Log.e(TAG, "onCreate()方法执行了"); new Thread() { @Override public void run() { while (!quit) { try { Thread.sleep(1000); } catch (Exception e) { } count++; } } }.start(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e(TAG, "onStartCommand()方法执行了"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.e(TAG, "onDestroy()方法执行了"); quit=true; } @Override public boolean onUnbind(Intent intent) { Log.e(TAG, "onUnbind()方法执行了"); return true; }}
<service android:name=".service.BindService"/>
运行截图:
4.IntentService
- IntentSevice不会阻塞主线程,可以自己处理耗时任务,最重要的一个方法onHandleIntent()。
- IntentService会创建单独的worker线程来处理所有的Intent请求。
- onHandleIntent()方法实现的代码,无需考虑多线程问题。
- 当所有请求处理完成后,IntentSevice会自动停止,无需调用stopSelf()方法来停止该Service。
-
MyIntentService.java
public class MyIntentService extends IntentService{ private static final String TAG = "MyIntentService"; private long mLong; public MyIntentService() { super("MyIntentService"); Log.e(TAG,"MyIntentService()方法执行了"); } @Override protected void onHandleIntent(Intent intent) { Log.e(TAG,"onHandleIntent()方法执行了"); //模拟耗时任务,让线程暂停20s //这段代码要是放在普通Service中会阻塞主线程。ANR异常,放在IntentSevice中不会有问题 mLong = System.currentTimeMillis() + 20 * 1000; while (System.currentTimeMillis()<mLong) { synchronized (this) { try { //线程等待20秒 wait(mLong-System.currentTimeMillis()); } catch (Exception e) { e.printStackTrace(); } } } } @Override public void onDestroy() { super.onDestroy(); Log.e(TAG,"onDestroy()方法执行了"); }}
<service android:name=".service.MyIntentService"/>
//开启服务的按钮 mStartButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { intent = new Intent(MainActivity.this, MyIntentService.class); startService(intent); } }); //停止服务的按钮 mStopButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { intent = new Intent(MainActivity.this, MyIntentService.class); stopService(intent); } });
当开启服务的时候,IntentService生命周期如下:
首先执行构造方法,然后执行onHandleIntent()方法
MyIntentService()——>onHandleIntent()
当停止服务的时候,IntentService生命周期
onDestroy()
截图如下:
0 0
- Android 中的Service
- Android 中的service
- Android中的Service学习
- Android中的Service使用
- android中的Service基础知识
- android init中的service
- Android 中的 Service 总结
- Android 中的 Service详解
- Android中的Service小结
- android init中的service
- Android 中的 Service 总结
- android init中的service
- android init中的service
- android中的service
- Android中的service基本知识
- Android中的Service详解
- android中的Service
- Android 中的 Service理解
- MySQL命令总结
- 深度学习大数据
- linux下grep的时候报Binary file stdout.log matches解决方法
- LeetCode笔记:165. Compare Version Numbers
- Android Studio 出现 Gradle's dependency cache may be corrupt 错误分析
- Android中的Service
- 单例模式
- Java初学者常见错误
- PAT甲级 1005:Spell it Right
- cocos2d_x之AnySDK接入流程
- 基于C语言sprintf函数的深入理解
- Java实现的拦截器
- android 点击两次后退键退出程序
- MVC+EF(9)