Android远程服务无法在Real设备

时间:2017-02-12 04:51:27

标签: java android aidl

远程服务
我正在测试Android远程服务 在第一个应用模块中,我提供服务,完成如下:

AppService服务

package com.hqyj.dev.aidltest;

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

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

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return new IAppServiceRemoteBinder.Stub() {
            @Override
            public void basicTypes(
                    int anInt, long aLong,
                    boolean aBoolean, float aFloat,
                    double aDouble, String aString)
                    throws RemoteException {
            }

            @Override
            public void setData(String data)
                    throws RemoteException {
                setRealData(data);

            }

            @Override
            public void registerCallback(IRemoteServiceCallback cb)
                    throws RemoteException {
                AppService.this.callback = cb;
            }

            @Override
            public void unregisterCallback(IRemoteServiceCallback cb)
                    throws RemoteException {
                AppService.this.callback = null;
            }
        };
    }

    private IRemoteServiceCallback callback;

    @Override
    public void onCreate() {
        super.onCreate();

        System.out.println("Service started");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("Service stop");
    }

    public void setRealData(String data) {
        this.data = data;
        System.out.println("data = " + data);
        try {
            Thread.sleep(1000);
            if (callback != null) {
                callback.vlueChanged(data);
            }
        } catch (InterruptedException | RemoteException e) {
            e.printStackTrace();
        }
    }

    private String data = "default date";
}

他们是两个AIDL文件:

IAppServiceRemoteBinder.aild

// IAppServiceRemoteBinder.aidl
package com.hqyj.dev.aidltest;

// Declare any non-default types here with import statements
import com.hqyj.dev.aidltest.IRemoteServiceCallback;
interface IAppServiceRemoteBinder {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt,
     long aLong,
     boolean aBoolean, float aFloat,
     double aDouble, String aString);

    void setData(String data);
    void registerCallback(IRemoteServiceCallback cb);
    void unregisterCallback(IRemoteServiceCallback cb);
}

IRemoteServiceCallback.aild

// IRemoteServiceCallback.aidl
package com.hqyj.dev.aidltest;

// Declare any non-default types here with import statements

interface IRemoteServiceCallback {
    /**
     * return from server
     */
    void vlueChanged(String value);
}

在AndroidManifest.xml中,此服务器发布如下:

的AndroidManifest.xml

 <service
            android:name="com.hqyj.dev.aidltest.AppService"
            android:enabled="true"
            android:exported="true"
            android:process=":remote">

        </service>

然后,在第二个模块中,使用包名复制所有这些aidl文件,如下所示:

enter image description here

在anotherapp的MainActivity中,完成如下:

package com.hqyj.dev.anotherapp;

import android.annotation.SuppressLint;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

import com.hqyj.dev.aidltest.IAppServiceRemoteBinder;
import com.hqyj.dev.aidltest.IRemoteServiceCallback;

public class MainActivity extends AppCompatActivity
        implements View.OnClickListener, ServiceConnection {

    private final String TAG = MainActivity.class.getSimpleName();
    private Intent intent;
    private IAppServiceRemoteBinder binder;
    private int count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_start).setOnClickListener(this);
        findViewById(R.id.btn_stop).setOnClickListener(this);
        findViewById(R.id.btn_set).setOnClickListener(this);

        intent = new Intent();
        intent.setComponent(new
                ComponentName("com.hqyj.dev.aidltest",
                "com.hqyj.dev.aidltest.AppService"));
    }

    @SuppressLint("DefaultLocale")
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_start:
                bindService(intent, this,
                        Context.BIND_AUTO_CREATE);

                break;
            case R.id.btn_set:
                if (binder != null) {
                    try {
                        binder.setData(
                                String.format("the %d times",
                                        ++count));
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
                break;
            case R.id.btn_stop:
                try {
                    binder.unregisterCallback(callback);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                unbindService(this);
                break;
        }
    }

    @Override
    public void onServiceConnected(
            ComponentName name, IBinder service) {
        binder =
                IAppServiceRemoteBinder.Stub.asInterface(service);
        Log.d(TAG, "onServiceConnected: " + 1);
        try {
            binder.registerCallback(callback);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }

    private IRemoteServiceCallback.Stub callback =
            new IRemoteServiceCallback.Stub() {
                @Override
                public void
                vlueChanged(String value) throws RemoteException {
                    Log.e(TAG, "vlueChanged: " + value);
                }
            };
}

如您所见,我使用bindService()来调用远程服务;
当我将这两个应用程序推送到使用Android 7.0作为平台的模拟器时,它运行良好 的

当我将这些应用推送到真实设备(使用Android 6.0)时,发生了流动的错误
enter image description here AIDL失败!!
为什么?

0 个答案:

没有答案