Android 小白 Service 入门

Service (服务) 属于 Android 组件之一, 它可以运行在 App 后台, 提供和该 App 相关的事情, 比如监听耳机孔的插拔, 和服务器保持长连接等. Service 的父类是Activity 父类的父类. 可以将服务看做是没有界面的 Activity, Activity 是有界面的组件.

使用服务需要首先在清单文件中注册, 它默认运行在主线程, 在创建时不可以进行耗时操作. Android 系统规定, Activity 5s 没有响应, Service 10s 没有响应, 就会发生 ANR 错误.

服务和线程的区别

Android 系统运行时, 会尽量保存每一个运行的 App 进程. 内存不够用时, 会首先回收老进程; 当内存足够时, 会率先恢复带有服务的进程. 所以, 将 App 相关功能放在服务中, 在一定程度上能够提高 App 的留存率.

Android 中进程的分类
  1. Visible Progress 可视进程, 可以看到,但是不能直接交互;
  2. Service Process 进程中在后台运行的服务;
  3. Background Process 不可见;在后台运行;
  4. Empty Process: 空进程;没有服务 也没有 activity 已经销毁
    它们的优先级: 可视进程 > 服务进程 > 后台进程 > 空进程. 当内存不足时, 首先回收优先级较低的进程;
使用服务的两种方式

1 启动方式

采用启动模式启动的服务, 在应用退出后, 服务不会销毁, 除非用户通过设置中的引用管理关闭服务.

    public void startService(View view) {
        Intent intent = new Intent();
        intent.setClass(this, MyService.class);
        startService(intent);
    }

    public void stopService(View view) {
        Intent intent = new Intent();
        intent.setClass(this, MyService.class);
        stopService(intent);
    }

2 绑定方式

采用绑定方式启动的服务, 随着应用退出而销毁. 绑定服务能够调用服务中的私有方法. 使用步骤如下:

定义服务

public class MyService extends Service {


    private class MyAgent extends Binder implements IService{

        @Override
        public void callMethodInService(String name, int money) {
            methodInService(name,money);
        }
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "服务命令执行了", Toast.LENGTH_SHORT).show();
        return super.onStartCommand(intent, flags, startId);
    }

    MyAgent agent;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        agent = new MyAgent();
        return agent;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Toast.makeText(this, "解绑了服务", Toast.LENGTH_SHORT).show();
        agent = null;
        return super.onUnbind(intent);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(this, "服务创建了", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "服务销毁了", Toast.LENGTH_SHORT).show();
    }

    private void methodInService(String name, int money){
        Toast.makeText(this, "服务方法调用了", Toast.LENGTH_SHORT).show();

    }
}

定义服务接口

public interface IService {
    public void callMethodInService(String name, int money);
}

使用

    private MyConn conn;
    private IService agent;
    private class MyConn implements ServiceConnection{

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            agent = (IService) service;
            Toast.makeText(MainActivity.this, "服务绑定时调用 onServiceConnected ", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            agent = null;
            Toast.makeText(MainActivity.this, "服务解绑时调用 onServiceDisconnected ", Toast.LENGTH_SHORT).show();
        }
    }

    public void bindService(View view) {
        Intent intent = new Intent();
        intent.setClass(this, MyService.class);
        if (conn == null){
            conn = new MyConn();
            bindService(intent, conn, BIND_AUTO_CREATE);
        }
    }

    public void unBindService(View view) {
        if (conn != null){
            unbindService(conn);
            conn = null;
        }
    }

    public void callMethodInService(View view) {
       if (agent != null){
           agent.callMethodInService("黑豹", 200);
       }else {
           Toast.makeText(this, "请先绑定服务", Toast.LENGTH_SHORT).show();
       }
    }
混合开启服务

既要通过开启服务, 让服务一直运行在后台; 同时又要调用服务中的方法, 称为混合开启服务. 其使用要严格遵守以下流程:

  1. 开启服务
  2. 绑定服务
  3. 调用服务中的方法
  4. 解绑服务
  5. 关闭服务

以上就是服务的简单介绍,更多功能待项目中发现。

关注和喜欢都是对我的鼓励和支持~

你可能感兴趣的:(Android 小白 Service 入门)