Android服务的基本使用1(启动服务)


我有一时,曾经屡次忆起儿时在故乡所吃的蔬菜:菱角、罗汉豆、茭白、香瓜。凡这些,都是极其鲜美可口的;都曾是使我思乡的蛊惑。后来,我在久别之后尝到了,也不过如此;惟独在记忆上,还有旧来的意味存留。他们也许要哄骗我一生,使我时时反顾。

                            鲁迅《朝花夕拾》

在布局中简单的写两个按钮

<Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="启动服务"
       android:onClick="start"
       />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="停止服务"
        android:onClick="stop"
        />

MainActivity

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);
    }


}

MyServices.java

public class MyServices 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();
    }

    //启动服务
    @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();
    }
}

**在启动服务中要注意的是 :
ANR:application not responsing应用程序未响应
why:耗时操作写到了主线程
how:子线程
why:服务和Thread的区别?
服务:死了可以活过来
线程:死了就是死了
QQ的接收消息:两三天没登,消息还是可以接收**

MyServices2.Java

public class MyServices2 extends IntentService {

    //无参调用父类有参
    public MyServices2() {
        super("");
    }

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

    //类似Service中的:onStartCommand
    /*
    *区别:1.在于可以直接进行耗时操作
    * 2.排队进行服务
     */


    @Override
    protected void onHandleIntent(Intent intent) {

        for (int i = 0; i < 10; i++) {
            Log.i("test", "i=" + i);
            SystemClock.sleep(200);
        }
    }
}

清单文件的配置

 <service android:name=".MyServices"
            android:exported="true"
            >service>
        <service android:name=".MyServices2"
            android:exported="true"
            >service>

在配置MyServices2的时候要写一个无参调用父类有参的构造函数,要不然会报错

你可能感兴趣的:(Android服务的基本使用1(启动服务))