Service 绑定方式启动,生命周期。绑定方式读取服务器数据

复制代码
package com.example.lenovo.service;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
    public MyService() {
        Log.e("TAG","MyService被创建");
    }

    @Override
    public void onCreate() {
        Log.e("TAG","onCreate被调用");
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        Log.e("TAG","onDestroy被调用");
        super.onDestroy();
    }

    @Override
    public void onRebind(Intent intent) {
        Log.e("TAG","onRebind被调用");
        super.onRebind(intent);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.e("TAG","onUnbind被调用");
        return super.onUnbind(intent);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String string = intent.getStringExtra("test");
        Log.e("TAG","onStartCommand被调用,并收到数据="+string);
        return super.onStartCommand(intent, flags, startId);
    }

    //代理对象
    public class MyBinder extends Binder
    {
        //定义数据交换的方法
        public int getTest()
        {
            return 123;
        }

    }

    int anInt;
    //回调方法
    //绑定
    @Override
    public IBinder onBind(Intent intent) {
        Log.e("TAG","onBind被调用");
       //启动业务逻辑
        new Thread()
        {
            @Override
            public void run() {
                for(int i = 0;i<100;i++)
                {
                    anInt++;
                    try {
                        Thread.sleep(1000);
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
        //代理对象
        return new MyBinder();
    }
}
MyService
复制代码
复制代码
 ServiceConnection sc;
    MyService.MyBinder myb;
    //绑定
    public void bt_3(View v)
    {
        //以绑定方式启动
        //准备Intent:显式意图
        Intent intent = new Intent(this,MyService.class);
        if (sc==null) {
            sc = new ServiceConnection() {
                @Override
                public void onServiceConnected(ComponentName name, IBinder service) {

                    //代理对象
                    myb = (MyService.MyBinder) service;
                    Toast.makeText(MainActivity.this, "绑定启动完成,接收返回的对象" + myb, Toast.LENGTH_SHORT).show();
                }

                //异常状态时触发
                @Override
                public void onServiceDisconnected(ComponentName name) {

                    Toast.makeText(MainActivity.this, "服务连接中断", Toast.LENGTH_SHORT).show();
                }
            };
        }
        //三个参数
        //1-意图
        //2-服务连接的实现类
        //3-启动方式,一般用Context.BIND_AUTO_CREATE
        bindService(intent, sc, Context.BIND_AUTO_CREATE);
    }
    //解除绑定
    public void bt_4(View v)
    {

        if (sc!=null) {
            unbindService(sc);
            sc=null;
        }
        else
        {
            Toast.makeText(MainActivity.this, "请先绑定服务", Toast.LENGTH_SHORT).show();
        }
    }
    //读取
    public void bt_5(View v)
    {
        //读取服务的运行数据
        //用代理对象
        Toast.makeText(MainActivity.this, "读到的服务数据="+myb.getTest(), Toast.LENGTH_SHORT).show();
    }
MainActivity.java
复制代码

posted @   百事没事  阅读(227)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示