设为首页 加入收藏

TOP

Android四大组件之Service(三)
2019-09-03 03:44:49 】 浏览:104
Tags:Android 四大 组件 Service
ServiceDisconnected(ComponentName name) { } ? @Override
public void onServiceConnected(ComponentName name, IBinder service) { myBinder = (MyService.MyBinder) service; myBinder.startDownload(); } }; ? @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindService = (Button) findViewById(R.id.bind_service); unbindService = (Button) findViewById(R.id.unbind_service); bindService.setOnClickListener(this); unbindService.setOnClickListener(this); } ? @Override public void onClick(View v) { switch (v.getId()) { case R.id.bind_service: Intent bindIntent = new Intent(this, MyService.class); bindService(bindIntent, connection, BIND_AUTO_CREATE); break; case R.id.unbind_service: unbindService(connection); break; default: break; } } ? }

可以看到,这里我们首先创建了一个ServiceConnection的匿名类,在里面重写了onServiceConnected()方法和onServiceDisconnected()方法,这两个方法分别会在ActivityService建立关联和解除关联的时候调用。在onServiceConnected()方法中,我们又通过 向下转型 得到了MyBinder的实例,有了这个实例,ActivityService之间的关系就变得非常紧密了。现在我们可以在Activity中根据具体的场景来调用MyBinder中的任何public方法,即实现了Activity指挥Service干什么Service就去干什么的功能。

 

当然,现在ActivityService其实还没关联起来了呢,这个功能是在Bind Service按钮的点击事件里完成的。可以看到,这里我们仍然是构建出了一个Intent对象,然后调用bindService()方法将ActivityService进行绑定。bindService()方法接收三个参数,第一个参数就是刚刚构建出的Intent对象,第二个参数是前面创建出的ServiceConnection的实例,第三个参数是一个标志位,这里传入BIND_AUTO_CREATE表示在ActivityService建立关联后自动创建Service,这会使得MyService中的onCreate()方法得到执行,但onStartCommand()方法不会执行(只有当我们通过 startService()方法请求启动服务时,调用此方法)。

解除Activity和Service之间的关联,调用

unbindService(connection);  
关于销毁Service说明
  • MyService的内部通过stopSelf()方法来销毁的;

  • 一个Service必须要在既没有和任何Activity关联又处理停止状态的时候才会被销毁;

  • 在Service的onDestroy()方法里去清理掉那些不再使用的资源,防止在Service被销毁后还会有一些不再使用的对象仍占用着内存;

     

7.IntentService

IntentService是Service的子类,在介绍IntentService之前,先来了解使用Service时需要注意的两个问题

  • Service 不会专门启动一个线程执行耗时操作,所有的操作都是在主线程中进行的,以至于容易出现ANR,所以需要手动开启一个子线程;

  • Service 不会自动停止,需要调用stopSelf()方法 或者 是stopService() 方法停止;

使用IntentService不会出现这两个问题,因为IntentService在开启Service时,会自动开启一个新的线程来执行它,另外,当Service运行结束后,会自动停止。

 

8.如何保证服务不会被杀死

第一种方式,返回 START_STICKYSTART_REDELIVER_INTENT

Service因内存不足而被系统kill后,一段时间后内存再次空闲时,系统将会尝试重新创建此Service,一旦创建成功后将回调onStartCommand方法,但其中的Intent将是null,除非有挂起的Intent,如pendingintent,这个状态下比较适用于不执行命令、但无限期运行并等待作业的媒体播放器或类似的服务。

     /**
     * 返回 START_STICKY 或 START_REDELIVER_INTENT
     * @param intent
     * @param flags
     * @param startId
     * @return
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //return super.onStartCommand(intent, flags, startId);
        return START_STICKY;
    }

 

第二种方式,提高service的优先权

<service  
    android:name="com.demo.UploadService"  
    android:enabled="true" >  
    <intent-filter android:priority="1000" >  
        <action android:name="com.demo.MyService" />  
    </intent-filter>  
</service>

结语

Service作为Android的四大组件之一,并且项目开发过程中一些场景下经常被使用到,小伙伴们赶紧上手实操,把它灵活的运用到项目中,结合上两期的Activity和BroadcastReceiver实现有趣的交互吧。

PS:如果还有未看懂的小伙伴,欢迎关注我们的WXGZH:下码看花,里面有各种大神回答小伙伴们遇到的问题哦~

 

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇JEB 无源码调试 以dvm smali字节.. 下一篇细数 SharedPreferences 的那些槽..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目