これは Stack Overflow での最初の質問です。私が直面している問題を解決するための専門知識を見つけていただければ幸いです。
Parcelable Code を実装しようとしていました。言っておくけど -
- 私は ConnectDevice クラスを持っています。これは、呼び出されると Bluetooth 経由で近くの任意のデバイスへの接続を確立します。
- サービスでConnectDeviceを呼び出しています-つまり、このサービスを呼び出すと、Androidと他のデバイス間の接続が確立されます。
- 他のアプリケーションで操作を行うために、この接続を他のアプリケーションで使用できるようにする必要があります。
- ConnectDevice オブジェクトには、他のすべてのアプリケーションが操作を実行するために必要な「bluetoothDeviceHandler」(BluetoothDeviceHandler クラス型) という静的変数があります。
だから、それを他のアプリケーションで利用できるようにするには -
ConnectDevice クラスを Parcelable にしました。
cd.bluetoothDeviceHandler
「cd」という ConnectDevice オブジェクトを (Service でインスタンス化した後) パーセルに書き込んで、同じ状態で読み戻してその変数などにアクセスできるようにします。そのようなjsonオブジェクトに変換する以外に、オブジェクト自体を小包に書き込む方法はありません。
gson = new Gson(); System.out.println("Connect Device : " + deviceHandler); String handler = gson.toJson(deviceHandler); dest.writeString(handler);
後で同じポリシーを使用して非整列化しました
handler = in.readString();
System.out.println("Handler String " + handler);
deviceHandler = gson.fromJson(handler, ConnectDevice.class);
System.out.println("Handler " + deviceHandler);
しかし、何をしようとしても、cd を null にすることになります... (サービスにバインドした後) そのため、他のアプリケーションで ConnectDevice のメソッドや変数にアクセスできません。
以下は私のサービスコードです
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
cd = ConnectDevice.getConnection(ConnectService.this);
cd.deviceHandler = cd;
// cd.connectDevice("00:06:66:47:57:80");
cd.connectDevice("00:06:66:47:E4:42");
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return new IHandler.Stub() {
@Override
public ConnectDevice getHandler() throws RemoteException {
// TODO Auto-generated method stub
System.out.println("I am here client connected");
return cd;
}
};
}
これは私のサンプルConnectDeviceクラスです
public class ConnectDevice implements Parcelable
{
public static BluetoothDeviceHandler bluetoothDeviceHandler = null;
public static ConnectDevice deviceHandler = null;
/* there are lot of codes which sets the bluetoothdeviceHandler when
the device is connected over bluetooth.(In service, after calling
cd.connect) deviceHandler will be set once the service initializes
this class as */
/*So, I am parcelling this deviceHandler object so that I can access all
of its method and variable in other applications...( I did not want to
connect in each application rather centralizing and accessing the same
connection across the application)*/
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
gson = new Gson();
System.out.println("Connect Device : " + deviceHandler);
String handler = gson.toJson(deviceHandler);
dest.writeString(handler);
}
void readFromParcel(Parcel in) {
handler = in.readString();
System.out.println("Handler String " + handler);
deviceHandler = gson.fromJson(handler, ConnectDevice.class);
System.out.println("Handler " + deviceHandler);
}
public static final Parcelable.Creator<ConnectDevice> CREATOR =
new Parcelable.Creator<ConnectDevice>() {
public ConnectDevice createFromParcel(Parcel in) {
return new ConnectDevice(in);
}
public ConnectDevice[] newArray(int size) {
return new ConnectDevice[size];
}
};
My Another アプリケーションは正しくバインドされます。しかし、オブジェクトを取得できません。常に null です。理由はわかりません。