android入门之服务

今天来讲一下安卓的四大基本组件之一的服务·




先来一个简单的排版

-<LinearLayout tools:context="com" android:orientation="vertical" android:paddingTop="@dimen/activity_vertical_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android">

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

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

</LinearLayout>

也就是两个按钮以便于模拟服务开启和关闭


与之相对应的MainActivity 

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

    public void start(View view){
            //开启服务
        startService(intent);

    }

    public void stop(View view){
        stopService(intent);//关闭服务
    }

}


然后需要新建一个类来继承Service 并重新它的方法

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;

/**
 * @author Zking-Snail
 * @time 2017/2/10 19:09
 * @Version ${REV}
 */
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);
            }

然后我这里是模拟一下进行打印的操作


可以看到我这里另开了一个线程来进行打印这类耗时的操作


个人的见解是:


一.在应用中,如果是长时间的在后台运行,而且不需要交互的情况下,使用服务。

同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需需要长时间运行的情况下使用线程。


二.如果任务占用CPU时间多,资源大的情况下,要使用线程。


关于服务的停止方式

                  stopSelf();//当第一个线程执行完毕,则会停止服务

            //所有的线程都执行完毕,才停止服务
            stopSelf(startId);


使用起来会有明显的区别


服务为了弥补也线程相比方面的不足还可以继承另一个类IntentService


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

/**
 * @author Zking-Snail
 * @time 2017/2/10 20:05
 * @Version ${REV}
 */
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);
        }
    }
}


相对于继承Service 而言IntentService、并不需要另开线程来执行耗时的操作,而且在关闭服务的时候继承了IntentService的类


会依照线程开辟的顺序来依次关闭线程!


与广播差不多的是也要在清单文件中声明


        <service android:name=".MyServices2"
            android:exported="true"//让服务可以被执行
            ></service>
    </application>

可能我说的不够好,不喜勿喷


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值