安卓 服务(Service)

首先来讲一下什么是服务:服务是安卓四大组件之一,与activity一样,代表可执行的程序。服务是没有界面的,一直在后台运行。作用呢就是:1、和广播类一起使用,开机启动服务监听系统的所有通讯。2、在后台播放音乐。3、木马程序。。。。。。
服务可分为本地服务(启动服务),远程服务(绑定服务)两种。先来讲一下本地服务吧!

一个本地服务可以被开启多次,但只会被创建一次,销毁也只会执行 一次。他的生命周期为:开始:startService(Intent intent); 结束:1,stopService(Intent intent); 2,stopSelf();表示不管用了多少次startService(),都会停止服务,并且只会停止第一个,不管你开启了多少个服务它都是同时执行的 3、stopSelf(int startId)。会等所有的startService都停止的时候才会停止。其服务执行的顺序是有序的,也就是执行了一个再执行下一个。

如何创建本地服务:
写一个类继承Service类,然后重写其中的几个生命周期的方法。
onBind(Intent intent) 只在调用bindService方法启动服务的时候才会执行。代码如下:

xml:

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动服务"
        android:onClick="openservice"
        />


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="停止服务"
        android:onClick="stopservice"
        />

activity:

package com.example.an_services;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

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,Myservice.class);
    }



//启动
    public void openservice(View view){
        intent.putExtra("data","下载的路径");
       startService(intent);

    }


//停止
    public  void stopservice(View view){
      stopService(intent);
    }
}

服务activity:

package com.example.an_services;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;
import android.support.annotation.Nullable;
import android.util.Log;

/**
 * Created by Administrator on 2017/2/12.
 */

public class Myservice extends Service{


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("test","onBind");
        return null;
    }

    @Override
    public void onCreate() {
        Log.i("test","onCreate");
        super.onCreate();
    }

    //ANR 错误  application not responsing

    //reason:耗时操作写到了主线程

    @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() {
        Log.i("test"," onDestroy");
        super.onDestroy();
    }
}

服务2activity:

package com.example.an_services;


import android.app.IntentService;
import android.content.Intent;
import android.os.SystemClock;
import android.util.Log;

/**
 * Created by Administrator on 2017/2/12.
 */

public class Myservices2 extends IntentService{


    public Myservices2(){
        super("");
    }

    public Myservices2(String name) {
        super(name);
    }

    //类似service中的:onStartCommand
    //可以直接写耗时操作 因为里面有异步任务类 执行有前后关系 而service没有


    @Override
    protected void onHandleIntent(Intent intent) {
        for (int i = 0; i <10 ; i++) {

            Log.i("test","i="+i);
            SystemClock.sleep(200);
        }
    }
}

注意:service耗时操作不能写在主线程里,需开辟一个子线程。而IntentService可以在主线程写耗时操作,因为里面有异步任务类 执行有前后关系 而service没有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值