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. 关闭服务

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

关注和喜欢都是对我的鼓励和支持~
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,651评论 25 709
  • 【Android Service】 Service 简介(★★★) 很多情况下,一些与用户很少需要产生交互的应用程...
    Rtia阅读 8,341评论 1 21
  • 2.1 Activity 2.1.1 Activity的生命周期全面分析 典型情况下的生命周期:在用户参与的情况下...
    AndroidMaster阅读 8,304评论 0 8
  • 你你你,总是这么的调皮 再美的鞋子也阻止不了你脱鞋的决心 米老鼠拖鞋在笑 唐老鸭拖鞋在睡觉 光着脚丫的天使啊 凉凉...
    沫之夏阅读 1,549评论 0 0
  • 2018年春的第一场茶事 不疾不徐来了。 无:放下、空无、空寂、专注 我:我执、我念、我思、我想 有:当下、静思、...
    江清秋阅读 3,674评论 2 3

友情链接更多精彩内容