android90 bind方式启动服务service调用service里的方法

简介:
package com.itheima.banzheng;

import com.itheima.banzheng.LeaderService.ZhouMi;

import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

    private Intent intent;
    private MyServiceConn conn;
    PublicBusiness pb;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intent = new Intent(this, LeaderService.class);
        conn = new MyServiceConn();//服务连接对象,成功后就调用
        //绑定领导服务
        bindService(intent, conn, BIND_AUTO_CREATE);//执行这个代码后服务就成功的绑定了连接就建立了,连接后会调用LeaderService的onBind方法返回IBinder对象,
    }
    
    public void click(View v){
        //调用服务的办证方法
        pb.QianXian();//这样就可以调用LeaderService的banZheng方法,否则是不能调用LeaderService的banZheng方法的
    }

    class MyServiceConn implements ServiceConnection{//服务连接对象
        //连接服务成功(成功拿到中间人IBinder的ZhouMi对象),此方法调用
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //service就是中间人ZhouMi
            pb = (PublicBusiness) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
    }
}
复制代码
复制代码
Service:
package com.itheima.banzheng; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder;
public class LeaderService extends Service { @Override public IBinder onBind(Intent intent) { // 返回一个IBinder对象,这个对象就是MainActivity和LeaderService之间的中间人对象 return new ZhouMi();//返回给了onServiceConnected的service参数 } class ZhouMi extends Binder implements PublicBusiness{ public void QianXian(){ banZheng(); } public void daMaJiang(){ System.out.println("陪李处打麻将"); } } public void banZheng(){ System.out.println("李处帮你来办证"); } }
复制代码

接口:

复制代码
package com.itheima.banzheng;

public interface PublicBusiness {

    void QianXian();
}
复制代码

清单文件:

<service android:name="com.itheima.banzheng.LeaderService"></service>

 

音乐播放器:

复制代码
package com.itheima.musicplayer;

import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

    MusicInterface mi;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(this, MusicService.class);
        //混合调用
        //为了把服务所在进程变成服务进程
        startService(intent);
        //为了拿到中间人对象
        bindService(intent, new MusicServiceConn(), BIND_AUTO_CREATE);
        //* 服务的混合调用
        //* 先开始、再绑定,先解绑、再停止
    }

    class MusicServiceConn implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mi = (MusicInterface) service;//返回中间人对象
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
        
    }

    //开始播放按钮
    public void play(View v){//Activity的方法
        mi.play();//中间人的方法,调用Service的方法
    }
    //暂停播放按钮
    public void pause(View v){
        mi.pause();
    }
}
//清单文件: <service android:name="com.itheima.musicplayer.MusicService"></service>
复制代码
复制代码
package com.itheima.musicplayer;

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

public class MusicService extends Service{
    @Override
    public IBinder onBind(Intent intent) {
        return new MusicController();//中间人对象
    }
    
    //必须继承binder,才能作为中间人对象返回给onServiceConnected的service
    class MusicController extends Binder implements MusicInterface{
        public void play(){
            MusicService.this.play();//中间人对象调用Service的方法
        }
        public void pause(){
            MusicService.this.pause();
        }
    }
    
    public void play(){//Service的方法
        System.out.println("播放音乐");
    }
    
    public void pause(){
        System.out.println("暂停播放");
    }

    
}
复制代码
复制代码
package com.itheima.musicplayer;

public interface MusicInterface {

    void play();
    void pause();
}
复制代码

 

复制代码
#找领导办证
* 把服务看成一个领导,服务中有一个banZheng方法,如何才能访问?
* 绑定服务时,会触发服务的onBind方法,此方法会返回一个Ibinder的对象给MainActivity,通过这个对象访问服务中的方法
* 绑定服务

        Intent intent = new Intent(this, BanZhengService.class);
        bindService(intent, conn, BIND_AUTO_CREATE);
* 绑定服务时要求传入一个ServiceConnection实现类的对象
* 定义这个实现类

        class MyServiceconn implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            zjr = (PublicBusiness) service;
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {    
        }
        
    }
* 创建实现类对象

         conn = new MyServiceconn();
* 在服务中定义一个类实现Ibinder接口,以在onBind方法中返回

        class ZhongJianRen extends Binder implements PublicBusiness{
        public void QianXian(){
            //访问服务中的banZheng方法
            BanZheng();
        }    
        public void daMaJiang(){
            
        }
    }
* 把QianXian方法抽取到接口PublicBusiness中定义

---
#两种启动方法混合使用
* 用服务实现音乐播放时,因为音乐播放必须运行在服务进程中,可是音乐服务中的方法,需要被前台Activity所调用,所以需要混合启动音乐服务
* 先start,再bind,销毁时先unbind,在stop
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4951823.html,如需转载请自行联系原作者


相关文章
|
3月前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
79 2
基于Android P,自定义Android开机动画的方法
|
3月前
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
187 2
|
27天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
52 15
Android 系统缓存扫描与清理方法分析
|
1月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
24 1
|
2月前
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
47 2
|
2月前
|
JavaScript 前端开发 Android开发
让Vite+Vue3项目在Android端离线打开(不需要起服务)
让Vite+Vue3项目在Android端离线打开(不需要起服务)
|
2月前
|
调度 Android开发 UED
Android经典实战之Android 14前台服务适配
本文介绍了在Android 14中适配前台服务的关键步骤与最佳实践,包括指定服务类型、请求权限、优化用户体验及使用WorkManager等。通过遵循这些指南,确保应用在新系统上顺畅运行并提升用户体验。
204 6
|
2月前
|
安全 API 开发工具
Android平台RTMP推送|轻量级RTSP服务如何实现麦克风|扬声器声音采集切换
Android平台扬声器播放声音的采集,在无纸化同屏等场景下,意义很大,早期低版本的Android设备,是没法直接采集扬声器audio的(从Android 10开始支持),所以,如果需要采集扬声器audio,需要先做系统版本判断,添加相应的权限。
|
2月前
|
编解码 开发工具 Android开发
Android平台实现屏幕录制(屏幕投影)|音频播放采集|麦克风采集并推送RTMP或轻量级RTSP服务
Android平台屏幕采集、音频播放声音采集、麦克风采集编码打包推送到RTMP和轻量级RTSP服务的相关技术实现,做成高稳定低延迟的同屏系统,还需要有配套好的RTMP、RTSP直播播放器
|
3月前
|
Android开发
Android在rootdir根目录创建自定义目录和挂载点的方法
本文介绍了在Android高通平台的根目录下创建自定义目录和挂载点的方法,通过修改Android.mk文件并使用`LOCAL_POST_INSTALL_CMD`变量在编译过程中添加目录,最终在ramdisk.img的系统根路径下成功创建了`/factory/bin`目录。
208 1