Service个人见解
来源:互联网 发布:android 淘宝首页轮播 编辑:程序博客网 时间:2024/05/16 21:30
前言
以前在开发app时,一直是用的居多,理解的比较少。现在就说说我对Service的个人理解,巩固个人基础。
Service是处于后台的,但是并不是说Service和Activity不处于同一线程,只是说Service其本身的运行并不依赖于UI界面,所以耗时操作还是放在子线程中不然会出现ANR
Service有两种启动方式1.startService,2.bindService
1.startService可以直接继承Service类,但是需要注意的是该Service运行在主线程,耗时操作要在子线程中执行。
上代码
public class ServiceTest extends Service { private Looper mLooper; private ServiceHandler mServiceHandler; private final class ServiceHandler extends Handler{ public ServiceHandler(Looper looper){ super(looper); } @Override public void handleMessage(Message msg) { //此处我们就可以做耗时操作了,具体原因看看Handler原理,不在细说 try { Thread.sleep(10000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } stopSelf(msg.arg1);//停止对应id的服务,不然该service会一直跑,同时注意不能直接调用stopSelf(), //因为在调用此函数销毁service之前,可能service又接收到新的启动请求,如果此时service被销毁,新的请求将得不到处理 } } @Override public void onCreate() { //设置线程优先级为后台 HandlerThread thread = new HandlerThread("ServiceTestStartArgument",Process.THREAD_PRIORITY_BACKGROUND); thread.start(); mLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mLooper); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("cherlin", "onStartCommand is running "); Message msg = mServiceHandler.obtainMessage();//消息池中拿来一个msg 不需要另开辟空间new,节约成本 msg.arg1 = startId; msg.sendToTarget(); return super.onStartCommand(intent, flags, startId); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onDestroy() { super.onDestroy(); Log.i("cherlin", "onDestroy: is running"); }}
若Service不需要同时处理多个请求,那么使用IntentService
将是最好选择,我们只需要重写onHanderIntent()方法,该方法接收一个回传的Intent参数,而且默认开启一个子线程,所以我们可以在里面进行耗时操作,而且也无需调用stopself()方法,onHandlerIntent()方法,会自动调用。
上代码
public class IntentServiceTest extends IntentService { public IntentServiceTest() { super("IntentServiceTest"); } @Override public void onCreate() { super.onCreate(); Log.i("cherlin","onCreate has run"); } /** * 该回调会默认开启一个子线程 * 为了验证我故意做个耗时操作来验证一下 * @param intent */ @Override protected void onHandleIntent(Intent intent) { try {//该线程睡眠10s Thread.sleep(10000); } catch (InterruptedException e) { Thread.currentThread().interrupt();//中断当前线程 } } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("cherlin", "onStartCommand: is running"); return super.onStartCommand(intent, flags, startId); }}
注册:
<service android:name=".services.ServiceTest"/><!--name唯一不可缺省属性值-->注意service为注册不会像Activity一样程序奔溃,所以不易察觉
调用:
Intent intent = new Intent(this,ServiceTest.class); startService(intent);
0 0
- Service个人见解
- 【个人】Content Provider个人见解
- J2ME的个人见解
- seo个人见解
- UML的个人见解
- 博弈 个人 见解
- 反射个人见解
- 易语言个人见解
- java UDP 个人见解
- Java ClassLoader个人见解
- Http的个人见解
- GeoQuiz的个人见解
- JVM 的个人见解
- Android LauncherMode个人见解
- Android Handler个人见解
- 反射的个人见解
- React Native个人见解。
- finally个人见解
- centos 备份和恢复
- i18n和i10n:国际化&本地化--gettext
- 大型网站架构演变和知识体系
- Ubuntu中常用的apt和dpkt命令
- 14.6.6 Configuring Thread Concurrency for InnoDB 配置线程并发
- Service个人见解
- Shiro(一)
- 第一个linux设备驱动程序
- Spring中@Async用法总结
- 阿里云mongodb 添加地理位置索引的心酸路。
- 最近邻插值、双线性插值理论,通过仿射变换使用插值算法
- hibernate根据JPA生成实体类笔记
- CXF客户端报Cannot create a secure XMLInputFactory问题
- poj 3233 Matrix Power Series(矩阵幂的和,矩阵快速幂)