文章目录
前言
在学习了服务的启动,停止,调用服务内部的方法后,让我们来实战巩固一下
提示:以下是本篇文章正文内容,下面案例可供参考
一、项目介绍
有一家银行,给不同人员提供了不同的服务,如下图
- 银行工作人员在普通用户的基础上拓展了两个功能
- 银行行长在银行工作人员的基础上拓展了一个功能
二、实现步骤
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,返回不同的对象
- 如果是普通用户的intent.getAction,返回new User()
- 如果是银行员工的intent.getAction,返回new StaffMember()
- 如果是银行行长的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。