借鉴自第一行
适合执行不需要和用户交互但是需要长期运行的任务。
服务依然依附于App的创建服务时所在的进程,当这个进程被杀,服务也会终止。
服务依然跑在主线程中,所以依然不可以写耗时操作,需要我们自行做好同步工作。
在Handler中更新UI轻快敏捷的方式
mHandler.obtainMessage(key,value).sendToTarget();
Exported:是否允许其他App访问这个服务
Enabled:是否启用这个服务
public class MyService extends Service { public MyService() { } //服务创建时执行,而且仅在服务第一次创建时执行 @Override public void onCreate() { super.onCreate(); } //服务开启时执行 @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); } @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException("Not yet implemented"); } }
开启和关闭服务
//启动服务 Intent startIntent = new Intent(this, MyService.class); startService(startIntent); //关闭服务 Intent stopIntent = new Intent(this, MyService.class); stopService(startIntent);
服务关闭自身
stopSelf();
活动和服务通信
服务端重写一个Binder,并且通过onBind让这个Binder和服务进行绑定
public class MyService extends Service { private static final String TAG = "xbh"; public MyService() { } //服务创建时执行 @Override public void onCreate() { super.onCreate(); } //服务开启时执行 @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); } @Override public IBinder onBind(Intent intent) { return new DownloadBinder(); } class DownloadBinder extends Binder { public void startDownload() { Log.i(TAG, "startDownload: "); } public int getProgress() { Log.i(TAG, "getProgress: "); return 0; } } }
Activity中
public class MainActivity extends AppCompatActivity { private static final String TAG = "xbh"; private MyService.DownloadBinder downloadBinder; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { downloadBinder = (MyService.DownloadBinder) service; downloadBinder.startDownload(); downloadBinder.getProgress(); } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ViewGroup root = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.activity_main, null, false); setContentView(root); //绑定服务 Intent bindIntent = new Intent(this, MyService.class); bindService(bindIntent, connection, BIND_AUTO_CREATE); //解绑服务 unbindService(connection); } }
现在绑定服务不是通过startActivity了,而是bindService,在这个方法中,要绑定的Service会写入这个connection,这里是MyService.class。所以unbind才可以仅仅通过connection解除绑定服务。
生命周期
不管调用多少次startService,都是只有一个服务的实例
如果通过bindService,可以加强和服务的联系,并且回调服务的onBind,可以获取服务的Binder,并调用其中的方法。
stopService,stopSelf,unbindService都会执行onDestory。
如果又startService又bind了的话,就需要用两种方法都解除一下,这个时候才会执行onDestory。
前台服务
如果希望服务一直运行不被回收,可以使用前台服务,会有一个正在运行的图标在系统的状态栏。
代码
//服务创建时执行 @Override public void onCreate() { super.onCreate(); Intent intent = new Intent(this, MainActivity.class); PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0); Notification notification = new Notification.Builder(this) .setContentTitle("This is content title") .setContentText("This is content text") .setWhen(System.currentTimeMillis()) .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)) .setContentIntent(pi) .build(); startForeground(1, notification);//1是前台服务通知的id,保证每个都一样 }