Ich baute zwei Projekt: eins ist Remote-Service Pro, das andere ist Test-Remote-Service Pro.Remote Service implementieren AIDL Schnittstelle wie folgt:Ich versuche, Intellected Call-Remote-Service mit 'BindService' von aidl in SDK 23 zu verwenden, aber es immer eine Null-Objekt-Referenz
package com.example.alpha.receiverserrvice.Services;
// Declare any non-default types here with import statements
interface Pay {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
int pay(String username,String password,float money);
}
Der Remote-Service-Register in manifeast:
<service android:name=".Services.PayService"
android:exported="true">
<intent-filter>
<action android:name="com.example.alpha.alipay"/>
</intent-filter>
Der Code-Remote-Dienst wie folgen:
public class PayService extends Service {
private Mybinder mybinder;
@Nullable
@Override
public IBinder onBind(Intent intent) {
mybinder=new Mybinder();
return mybinder;
}
@Override
public void onCreate() {
super.onCreate();
}
private class Mybinder extends Pay.Stub{
@Override
public int pay(String username, String password, float money) throws RemoteException {
return safePay(username,password,money);
}
}
private int safePay(String username,String password,float money){
if("gyq".equals(username)&&"123456".equals(password)){
if(money>100){
return 200;
}
else return 500;
}
else return 404;
}
}
und testen Remote-Service-Code in dem anderen Projekt folgen:
public class MainActivity extends AppCompatActivity {
private Myconn conn;
private Pay payment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent=new Intent("com.example.alpha.alipay");
intent.setPackage("com.example.alpha.receiverserrvice.Services");
conn=new Myconn();
bindService(intent, conn, Context.BIND_AUTO_CREATE);
Button button= (Button) findViewById(R.id.pay);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Payfor(view);
}
});
}
public void Payfor(View view) {
try {
int resultcode= payment.pay("gyq123", "123456", 300.0f);
if (200==resultcode) {
Toast.makeText(this, "pay success.", Toast.LENGTH_SHORT).show();
}
else if (resultcode==404) {
Toast.makeText(this, "username or password is incorrect", Toast.LENGTH_SHORT).show();
}
else if (resultcode==500) {
Toast.makeText(this, "Lack of balance", Toast.LENGTH_SHORT).show();
}
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private class Myconn implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
payment=Pay.Stub.asInterface(service);
Log.d("zhifubao.client", "bind remote servoce success.");
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
}
Schließlich wird der Fehler in Android Studio folgen:
java.lang.NullPointerException: Attempt to invoke interface method 'int com.example.alpha.receiverserrvice.Services.Pay.pay(java.lang.String, java.lang.String, float)' on a null object reference
at com.example.alpha.testpayservice.MainActivity$override.Payfor(MainActivity.java:47)
at com.example.alpha.testpayservice.MainActivity$override.access$dispatch(MainActivity.java)
at com.example.alpha.testpayservice.MainActivity.Payfor(MainActivity.java:0)
at com.example.alpha.testpayservice.MainActivity$1$override.onClick(MainActivity.java:40)
at com.example.alpha.testpayservice.MainActivity$1$override.access$dispatch(MainActivity.java)
at com.example.alpha.testpayservice.MainActivity$1.onClick(MainActivity.java:0)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Also, wenn ich versuche, Remote-Service zu binden um Methode es immer zurück zu benennen mich Nullobjektreferenz, ich weiß nicht, wo Problem ist, Wenn Sie es finden können, bitte sell.Thank Sie.
so sagen Sie, dass in 'MyConn # onServiceConnected' der' IBinder service' Parameter null ist? – pskink
@alpha Es wäre nützlich, wenn Sie die tatsächliche Fehlerausgabe sowie den Code – Tibrogargan
verknüpfen könnten Versuchen Sie, diese Zeile 'intent.setPackage (" com.example.alpha.receiverservice.Services ") zu entfernen;' – Vasiliy