远程服务
例如打英雄时想要买皮肤,支付方式需要用到银联或者支付宝等第三方软件里面的一部分功能,那么就需要一个类似“中间商”的角色,为两者搭建桥梁。
简单案例:
1.建立一个类继承Service类(支付服务)
public class PayService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
private class PayBinder extends IService.Stub{ //IService变成aibl文件后的继承方式
@Override
public double payFor(String account, String password, double money)
throws RemoteException {
return pay(account, password, money);
}
}
public double pay(String account,String password,double money){
double code = -1;
if (account.equals("168.com")&&password.equals("123456")) { //对条件做出判定
if (money > 12.5) {
if (money == 200) {
code = 1000200;
}else if (money == 680) {
code = 1000680;
}else{
code = money;
}
}
}else{ //账号密码或错误
code = 1001;
}
return code;
}
@Override
public void onCreate() {
Log.d("tada", "创建支付服务");
super.onCreate();
}
@Override
public boolean onUnbind(Intent intent) {
Log.d("tada", "解绑");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
Log.d("tada", "断开");
super.onDestroy();
}
}
建立好接口,找到源文件,将原文件重命名为 aibl 文件
在清单里注册,设定动作
interface IService {
double payFor(String account,String password,double money);
}
2.另一个应用(英雄买皮肤)
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void buySkin(View view){
Intent intent = new Intent();
intent.setAction("com.at.remoteService.pay");
bindService(intent, connection, BIND_AUTO_CREATE);
}
public void bind(View view){
Intent intent = new Intent(); //建立联系,绑定服务
intent.setAction("com.at.remoteService.pay");
bindService(intent, connection, BIND_AUTO_CREATE);
}
private IService iservice;
private ServiceConnection connection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iservice = IService.Stub.asInterface(service); //获取对象
pay();
}
@Override
public void onServiceDisconnected(ComponentName name) {
iservice = null;
}
private void pay() { //调用支付方法
try {
int payfor = (int) iservice.payFor("168.com", "123456", 208);
switch (payfor) {
case 1000200:
Toast.makeText(MainActivity.this, "购买欧蕾那皮肤成功", 0).show();
break;
case 1000680:
Toast.makeText(MainActivity.this, "购买艾希传说皮肤成功", 0).show();
break;
case 1001:
Toast.makeText(MainActivity.this, "账号或密码不正确", 0).show();
break;
default:
break;
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
}
电话监听
public class CellService extends Service {
private TelephonyManager tm;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
// TODO
Log.d("tada", "创建服务,电话监听开启");
super.onCreate();
tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
}
private PhoneStateListener listener = new PhoneStateListener(){
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
stopRecording(); //停止录音
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.d("tada", "电话铃响");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
startRecording(); //电话通话
Log.d("tada", "电弧通话"+incomingNumber);
break;
default:
break;
}
Log.d("tada", " "+state+" "+incomingNumber);
}
};
private void startRecording() {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 文件
File file = new File(
Environment.getDownloadCacheDirectory(),System.currentTimeMillis()+".3gp");
FileDescriptor descriptor;
mRecorder.setOutputFile(file.getAbsolutePath());
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
mRecorder.prepare();
} catch (Exception e) {
Log.e("vivi", "prepare() failed");
}
mRecorder.start();
}
private MediaRecorder mRecorder;
private void stopRecording() {
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
};
@Override
public void onDestroy() {
// 反注册
super.onDestroy();
tm.listen(listener, PhoneStateListener.LISTEN_NONE);
Log.d("tada", "停止电话监听");
}
}
获取权限,在虚拟机上运行