[学习笔记]认识Android Service

以下内容纯粹为本人学习笔记【记录】之用,所听课程(Q群群友百度网盘提供)为极客学院一位老师所讲(老师大名我尚未知晓),如有侵权请告知。在此特别感谢这位老师录制的视频资料。
1、使用Service
这里写图片描述
MainActivity.java

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(MainActivity.this, MyService.class);//初始化Intent

        findViewById(R.id.btnStartService).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //启动服务;方式与启动Activity类同
                startService(intent);
            }
        });

        findViewById(R.id.btnStopService).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //停止服务;方式也与启动Activity类同
                stopService(new Intent(intent));
            }
        });
    }
}

MyService.java

public class MyService extends Service {
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //创建一个线程,不断地运行。以下可用来在后端执行一些必要的代码
        new Thread(){
            @Override
            public void run() {
                super.run();
                System.out.println("服务在运行...");

                //休眠1秒
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
        //外界执行了StartService后,会执行此
        return super.onStartCommand(intent, flags, startId);
    }
}

activity_main.xml

    <Button
        android:text="启动服务"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnStartService" />

    <Button
        android:text="停止服务"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnStopService" />

2.绑定服务
相同的代码用封装的方法
绑定服务的方法是bindService();解除绑定服务的方法是unbindService();
修改上述代码:
MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection {

    private Intent intent;//定义成员变量

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intent = new Intent(MainActivity.this, MyService.class);//初始化Intent

        //启动服务
        findViewById(R.id.btnStartService).setOnClickListener(this);
        //停止服务
        findViewById(R.id.btnStopService).setOnClickListener(this);
        //绑定服务
        findViewById(R.id.btnBindService).setOnClickListener(this);
        //解除绑定服务
        findViewById(R.id.btnUnBindService).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        //方式也与启动Activity类同
        switch (view.getId()) {
            case R.id.btnStartService:
                startService(intent);
                break;
            case R.id.btnStopService:
                stopService(intent);
                break;
            case R.id.btnBindService:
                bindService(intent, this, Context.BIND_AUTO_CREATE);
                break;
            case R.id.btnUnBindService:
                unbindService(this);
                break;

        }
    }
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        //服务绑定成功之后执行
        System.out.println("Service Connected success");
    }
    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        //所在服务进程崩溃或杀掉之后执行
    }
}

MyService.java

public class MyService extends Service {
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //创建一个线程,不断地运行。以下可用来在后端执行一些必要的代码
        new Thread(){
            @Override
            public void run() {
                super.run();
                System.out.println("服务在运行...");

                //休眠1秒
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
        //外界执行了StartService后,会执行此
        return super.onStartCommand(intent, flags, startId);
    }
}

activity.xml添加两个按钮用于绑定服务和解除绑定服务

    <Button
        android:text="绑定服务"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnBindService" />

    <Button
        android:text="解除服务"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnUnBindService" />

这里写图片描述

3.Service生命周期
创建onCreate(),若想在Create里执行一段程序,可在此办法内添加代码
销毁onDestroy()
在MyService.java重载onCreate()和onDestroy(),观察Service生命周期

    //Service生命周期:创建和销毁
    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("Service Create");
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("Service Destroy");
    }

若同时启动和绑定了服务,那么必须同时停止服务和解除绑定服务,服务才会停止掉。

启动服务–Back–回到程序,Service仍在运行着–停止服务,此时Service停掉,即Destroy–绑定服务,Service将处于运行状态– Back,将抛出异常,Service同时Destroy;这意味着Activity若和某个Service绑定的话,在退出Activity时,Service将解除绑定。
在onStartCommand()方法下添加打印语句,以“监听”,发现多次点击启动服务,onCreate()只会执行一次,而onStartCommand()会与点击次数执行相同次数。你在外界,只要你执行startService(),在内部就会执行onStartCommand();而在第一次执行startService()时,会执行onCreate(),以后只会执行onStartCommand(),不会重复执行onCreate()

System.out.println("onStartCommand");

这里写图片描述

如何来控制程序开始和停止?
再写一个成员函数

private boolean serviceRunning = false;//默认情况下是非运行状态

循环将在serviceRunning下执行:false,循环调出,线程结束。

@Override
    public void onCreate() {
        super.onCreate();
        System.out.println("Service Create");
        serviceRunning = true;

        //创建一个线程,不断地运行。以下可用来在后端执行一些必要的代码
        new Thread(){
            @Override
            public void run() {
                super.run();
                while (serviceRunning) {
                    System.out.println("服务在运行...");

                    //休眠1秒
                    try {
                        sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

修改后的MyService.java全部代码如下

public class MyService extends Service {
    private boolean serviceRunning = false;//默认情况下是非运行状态
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("onStartCommand");
        //外界执行了StartService后,会执行此
        return super.onStartCommand(intent, flags, startId);

    }

    //Service生命周期:创建和销毁
    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("Service Create");
        serviceRunning = true;

        //创建一个线程,不断地运行。以下可用来在后端执行一些必要的代码
        new Thread(){
            @Override
            public void run() {
                super.run();
                while (serviceRunning) {
                    System.out.println("服务在运行...");

                    //休眠1秒
                    try {
                        sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("Service Destroy");
        serviceRunning = false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值