四大组件之Service
来源:互联网 发布:html5 css3 js 教程 编辑:程序博客网 时间:2024/06/01 10:13
四大组件:Activity、Service、Broadcast、ContentProvider。他们都有一个共同点,需要在manifest中注册,不注册不能用的。想到了没?
摘要
Service:服务,是Activty把他启动了之后就管不了他了的一个存在,他可以做任何事,包括操作UI,因为他是运行在主线程的。如果Activty非要管也可以,用Service的onBind()方法,关联之后Activty是可以调用Service内部的方法的。当然就调用一下,想要方法运行的结果,需要写接口回调之类的方式,不然还是传不回来。Service和Activity不怎么熟。说明Service还挺独立。一般用Service干什么呢?例如:下载个大文件、播放音频、实时监控位置、查询天气之类的后台服务比较常见 。零星的实现方式在下面,有这里说的所需知识点。
我能说我以前写service都是自己建个service类然后去manifest里注册吗?今天知道可以像建activity一样新建service,他也会自动生成注册代码。
注册文件:
<!--enabled:是否启用这个服务;exported:是否允许除了当前程序之外的其他程序访问这个服务--> <service android:name=".MyService" android:enabled="true" android:exported="true"> </service>
Service一般常用方法就这几个:
public class MyService extends Service { public MyService() { } /** * 用于让activity和service关联 */ @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException("Not yet implemented"); } /** * 服务第一次启动调用,服务是在主线程中运行的,耗时操作都要另开子线程 */ @Override public void onCreate() { super.onCreate(); } /** * 每次服务启动都要调用,服务是在主线程中运行的,耗时操作都要另开子线程 */ @Override public int onStartCommand(Intent intent, int flags, int startId) { new Thread(new Runnable(){ public void run(){ } }).start(); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); }}
- 启动服务、停止服务都是定义在Context类中的,所以在活动里可以直接调用。
//启动服务 Intent intent=new Intent(this,MyService.class); startService(intent); //停止服务 intent=new Intent(this,MyService.class); startService(intent);
- 当然也可以在Service里停止服务,在MyService的任何一个位置调用stopSelf()方法就可以。
- 活动与服务之间的关联,是用Binder建立的。
private DownloadBinder mBinder = new DownloadBinder(); class DownloadBinder extends Binder { public void startDownload() { } public int getProgress() { return 0; } } /** * 用于让activity和service关联 * * @param intent * @return */ @Override public IBinder onBind(Intent intent) { return mBinder; }
启动关联
//绑定服务 BIND_AUTO_CREATE:表示在活动和服务进行绑定后自动创建服务 intent = new Intent(this, MyService.class); bindService(intent, serviceConnection, BIND_AUTO_CREATE); //解绑服务 intent = new Intent(this, MyService.class); unbindService(serviceConnection);
- 每个服务只会存在一个实例,不管调用了多少次StartService(),只需调用一次stopService()或stopSelf()方法,服务就会停下来了。
- 生命周期,有两种方式可以启动服务:StartService()、bindService()
- StartService():(onCreate())— onStartCommand()— onDestory()
- bindService():(onCreate())— onBind()— onDestory()
- 根据Android系统的机制,一个服务只要被启动或者被绑定之后,就会一直处于运行状态,必须要让以上两种条件同事不满足。服务才能被销毁。所以:StartService()和bindService()都使用了就需要stopService()和unbindService()都调才会把服务真正停掉。
又来,又提供了工具
Android总是会提供一些傻瓜式工具,就像下面这个:IntentService类,一个怕你忘了停止服务而存在的会自动停止服务的服务类。在活动中启动了这个服务之后,他运行完会自己停止的。就是说只管启动,之后就不用管了。
public class MyIntentService extends IntentService { private String TAG = "MyIntentService"; public MyIntentService() { //调用父类的有参构造函数 super("MyIntentService"); } @Override protected void onHandleIntent(@Nullable Intent intent) { //打印当前线程Id Log.i(TAG, "onHandleIntent: Thread id is " + Thread.currentThread().getId()); }}
启动
//启动IntentService intent = new Intent(this, MyIntentService.class); startService(intent);
前台服务
有时候我们并不想启动执行完一段小功能就停掉了,例如下载任务,我们需要他一直存在,可能比较长的一段时间,为了保证不被回收,“前台服务”就是个不错的选择。
实现效果:一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果,写法也非常像。例如为了防止服务被回收掉可以用前台服务,像天气预报之类的功能也可以用前台服务。
启动就是上面的随便哪个启动方式都行,反正都要执行onCreate()方法的。这个就是写在onCreate()里的。
关闭的方式嘛:stopForeground(true);这是在Service里的写法。
- 四大组件之Service
- 四大组件之Service
- 四大组件之Service
- 四大组件之Service
- 四大组件之Service
- 四大组件之Service
- 四大组件之Service
- 四大组件之service
- 四大组件之Service
- 四大组件之Service
- 四大组件之Service
- 四大组件之Service
- 四大组件之Service
- 四大组件之Service
- 四大组件之Service
- 四大组件之Service
- 四大组件之Service
- 四大组件之service
- android 使用adb工具抓日志,,,,抓网络包:
- 全选、反选
- springmvc中的文件上传
- C语言-计算长方形的面积
- Spark性能调优——扩展篇
- 四大组件之Service
- git/git-bash中的branch、checkout指令(git指令)
- 需要排序的最短子数组的长度
- 20171101
- bzoj 1969: [Ahoi2005]LANE 航线规划 离线+树链剖分+线段树
- 【剑指offer】41-50题
- Javascript DOM图片库
- MVP模式的OKhttp请求网络数据,xrecyclerview上拉刷新,下拉加载
- 图像识别与处理之Opencv——霍夫变换编程思路(11月2日暂存)