服务(service)-----本地服务

服务的简介: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);
        }
    }
}

不需要写线程,因为里面有异步任务类,并且呈有序排列,内部有消息队列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值