Android--Service③-->案例一--->银行服务

本文介绍了如何使用Android Service实现一个银行服务案例,包括为不同角色(普通用户、银行员工、银行行长)提供不同服务功能。通过定义多个接口和Binder子类,实现了根据Intent的Action返回不同权限的对象,允许调用Service中对应的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

在学习了服务的启动,停止,调用服务内部的方法后,让我们来实战巩固一下

提示:以下是本篇文章正文内容,下面案例可供参考

一、项目介绍

有一家银行,给不同人员提供了不同的服务,如下图

  1. 银行工作人员在普通用户的基础上拓展了两个功能
  2. 银行行长在银行工作人员的基础上拓展了一个功能

二、实现步骤

1.写三个接口

IUser:用户接口

public interface IUser {
    void save(float money);

    void withdraw(float money);

    void loan();
}

IStaffMembe:继承了IUser接口,拓展了两个新方法

public interface IStaffMember extends IUser{
    void checkCredit();

    void frozenAccount();
}

IPresident:银行行长接口,继承IStaffMember接口,拓展了一个新方法

public interface IPresident extends IStaffMember{
    void modifyAccountBalance(float money);
}

2.三个Binder的子类来应对不同的请求

User 继承了Binder,实现了IUser接口

public class User extends Binder implements IUser {
    private static final String TAG = User.class.getName();

    @Override
    public void save(float money) {
        Log.i(TAG, "save---->" + money);
    }

    @Override
    public void withdraw(float money) {
        Log.i(TAG, "withdraw---->" + money);
    }

    @Override
    public void loan() {
        Log.i(TAG, "loan...");
    }
}

StaffMember 继承了Binder,实现了IStaffMember接口

public class StaffMember extends Binder implements IStaffMember {
    private static final String TAG = StaffMember.class.getName();

    @Override
    public void checkCredit() {
        Log.i(TAG, "checkCredit...");
    }

    @Override
    public void frozenAccount() {
        Log.i(TAG, "frozenAccount...");
    }

    @Override
    public void save(float money) {
        Log.i(TAG, "save---->" + money);
    }

    @Override
    public void withdraw(float money) {
        Log.i(TAG, "withdraw---->" + money);
    }

    @Override
    public void loan() {
        Log.i(TAG, "loan...");
    }
}

President 继承了Binder,实现了IPresident接口

public class President extends Binder implements IPresident {
    private static final String TAG = President.class.getName();

    @Override
    public void modifyAccountBalance(float money) {
        Log.i(TAG, "modifyAccountBalance---->" + money);
    }

    @Override
    public void checkCredit() {
        Log.i(TAG, "checkCredit...");
    }

    @Override
    public void frozenAccount() {
        Log.i(TAG, "frozenAccount...");
    }

    @Override
    public void save(float money) {
        Log.i(TAG, "save---->" + money);
    }

    @Override
    public void withdraw(float money) {
        Log.i(TAG, "withdraw---->" + money);
    }

    @Override
    public void loan() {
        Log.i(TAG, "loan...");
    }
}

综上,定义了三个Binder,拥有不同的权限,拥有响应不同的用户请求

2.定义一个Service的子类

1:Service配置文件

<service
            android:name="com.lbj23.bankExample.services.BankService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.lbj23.bankExample.ACTION_NORMAL_USER" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.lbj23.bankExample.ACTION_NORMAL_STAFFMEMBER" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.lbj23.bankExample.ACTION_NORMAL_PRESIDENT" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>

有三个密码,对应不同角色的请求,Service的实现类中会分别响应
2:子类

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

    @Override
    public IBinder onBind(Intent intent) {
        String action = intent.getAction();
        Binder binder = null;
        if (TextUtils.equals(IConfig.USER_PWD, action)) {
            binder = new User();
        } else if (TextUtils.equals(IConfig.STAFFMEMBER_PWD, action)) {
            binder = new StaffMember();
        } else if (TextUtils.equals(IConfig.PRESIDENT_PWD, action)) {
            binder = new President();
        }
        return binder;
    }
}

对应不同的Action,返回不同的对象

  1. 如果是普通用户的intent.getAction,返回new User()
  2. 如果是银行员工的intent.getAction,返回new StaffMember()
  3. 如果是银行行长的intent.getAction,返回new President()

3.定义三个活动,发出不同请求,获取不同的Binder来调用服务内部不同的方法

在这里插入图片描述

1,选择普通员工后发出普通用户请求

1.界面:
在这里插入图片描述
2.活动代码:

public class UserServiceActivity extends AppCompatActivity implements View.OnClickListener {

    private User user;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_service);
        init();
        bindClick();
    }

    private final ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            user = (User) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            user = null;
        }
    };

    private void init() {
        Intent intent = new Intent(this, BankService.class);
        intent.setAction(IConfig.USER_PWD);
        bindService(intent, conn, BIND_AUTO_CREATE);
    }

    private void bindClick() {
        View view = (View) findViewById(R.id.user_include_user);
        view.findViewById(R.id.tv_save).setOnClickListener(this);
        view.findViewById(R.id.tv_withdraw).setOnClickListener(this);
        view.findViewById(R.id.tv_loan).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.tv_save) {
            user.save(IConfig.MONEY);
        } else if (v.getId() == R.id.tv_withdraw) {
            user.withdraw(IConfig.MONEY);
        } else if (v.getId() == R.id.tv_loan) {
            user.loan();
        }
    }
}

普通用户的请求会返回一个User对象,所以我们定义一个User变量去接收,然后就可以通过界面上的按钮来调用普通用户的存钱,取钱,贷款功能

2,选择银行员工后发出银行员工请求

1.界面:
在这里插入图片描述
2.活动代码:

public class StaffMemberServiceActivity extends AppCompatActivity implements View.OnClickListener {
    private StaffMember binder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_staff_member_service);
        bindClick();
        init();
    }

    private final ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            binder = (StaffMember) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            binder = null;
        }
    };

    private void init() {
        Intent intent = new Intent(this, BankService.class);
        intent.setAction(IConfig.STAFFMEMBER_PWD);
        bindService(intent, conn, BIND_AUTO_CREATE);
    }

    private void bindClick() {
        View include_user = findViewById(R.id.staff_member_include_user);
        include_user.findViewById(R.id.tv_save).setOnClickListener(this);
        include_user.findViewById(R.id.tv_withdraw).setOnClickListener(this);
        include_user.findViewById(R.id.tv_loan).setOnClickListener(this);
        View include_staff_member = findViewById(R.id.staff_member_include_staff_member);
        include_staff_member.findViewById(R.id.tv_check_credit).setOnClickListener(this);
        include_staff_member.findViewById(R.id.tv_frozen_account).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.tv_save) {
            binder.save(IConfig.MONEY);
        } else if (v.getId() == R.id.tv_withdraw) {
            binder.withdraw(IConfig.MONEY);
        } else if (v.getId() == R.id.tv_loan) {
            binder.loan();
        } else if (v.getId() == R.id.tv_check_credit) {
            binder.checkCredit();
        } else if (v.getId() == R.id.tv_frozen_account) {
            binder.frozenAccount();
        }
    }
}

银行员工的请求会返回一个StaffMember对象,所以我们定义一个StaffMember变量去接收,然后就可以通过界面上的按钮来调用普通用户的存钱,取钱,贷款功能,和银行员工拓展的检查信用,冻结账号的方法。

2,发出银行行长请求

1.界面:
在这里插入图片描述
2.活动代码:

public class PresidentServiceActivity extends AppCompatActivity implements View.OnClickListener {


    private President binder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_president_service);
        bindClick();
        init();
    }

    private final ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            binder = (President) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            binder = null;
        }
    };

    private void init() {
        Intent intent = new Intent(this, BankService.class);
        intent.setAction(IConfig.PRESIDENT_PWD);
        bindService(intent, conn, BIND_AUTO_CREATE);
    }

    private void bindClick() {
        View include_user = findViewById(R.id.president_include_user);
        include_user.findViewById(R.id.tv_save).setOnClickListener(this);
        include_user.findViewById(R.id.tv_withdraw).setOnClickListener(this);
        include_user.findViewById(R.id.tv_loan).setOnClickListener(this);
        View include_staff_member = findViewById(R.id.president_include_staff_member);
        include_staff_member.findViewById(R.id.tv_check_credit).setOnClickListener(this);
        include_staff_member.findViewById(R.id.tv_frozen_account).setOnClickListener(this);
        View include_president = findViewById(R.id.president_include_president);
        include_president.findViewById(R.id.tv_modify_account_balance).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.tv_save) {
            binder.save(IConfig.MONEY);
        } else if (v.getId() == R.id.tv_withdraw) {
            binder.withdraw(IConfig.MONEY);
        } else if (v.getId() == R.id.tv_loan) {
            binder.loan();
        } else if (v.getId() == R.id.tv_check_credit) {
            binder.checkCredit();
        } else if (v.getId() == R.id.tv_frozen_account) {
            binder.frozenAccount();
        } else if (v.getId() == R.id.tv_modify_account_balance) {
            binder.modifyAccountBalance(IConfig.MONEY);
        }
    }
}

银行员工的请求会返回一个StaffMember对象,所以我们定义一个StaffMember变量去接收,然后就可以通过界面上的按钮来调用银行员工的存钱,取钱,贷款**检查信用,冻结账号等功能,还能调用拓展的修改账号金额功能


总结

给Service设置三个Action,创建三个不同的Binder子类,用于响应三个不同的Action。

项目压缩包

点击下载

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值