四大组件: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里的写法。