服务的简介:Android四大基本组件之一,没有图形用户界面,总是在后台执行耗时操作。
服务的生命周期:onCreate onStartCommand onDestroy onBind
本地服务:onStartCommand
服务的停止:
stopService
stopSelf
1.stopSelf()
2.stopSelf(id)
开始服务
public class MainActivity extends AppCompatActivity {
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(this,MyServices.class);
}
public void start(View view){
intent.putExtra("data","下载的路径");
startService(intent);
}
public void stop(View view){
stopService(intent);
}
}
service:
public class MyServices extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i("test","onBind");
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.i("test","onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String data=intent.getStringExtra("data");
Log.i("test","onStartCommand,"+data);
new MyThread(startId).start();
return super.onStartCommand(intent, flags, startId);
}
class MyThread extends Thread{
private int startId;
public MyThread(int startId) {
this.startId = startId;
}
@Override
public void run() {
super.run();
//耗时操作
for (int i = 0; i <10 ; i++) {
Log.i("test","i="+i);
SystemClock.sleep(1000);
}
//停止服务
//stopSelf();//当第一个线程执行完毕,则会停止服务
//所有的线程都执行完毕,才停止服务
stopSelf(startId);
}
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("test","onDestroy");
}
}
当主线程操作耗时操作时项目报错(ANR: application not responsing应用程序未响应),解决方法:把耗时操作写到子线程里即可。
服务跟线程的区别(我所理解的):线程死了就是死了,然而服务死了还可以活。(将军与士兵)
在清单文件配置自己所写的服务:
<service android:name=".MyServices"
android:exported="true">
</service>
IntentService:
public class MyServices2 extends IntentService {
public MyServices2() {
super("");
}
public MyServices2(String name) {
super(name);
}
//类似Service中的:onStartCommand
@Override
protected void onHandleIntent(Intent intent) {
for (int i = 0; i <10 ; i++) {
Log.i("test","i="+i);
SystemClock.sleep(200);
}
}
}
不需要写线程,因为里面有异步任务类,并且呈有序排列,内部有消息队列