2つのAndroidアプリケーションをAIDLファイルにバインドしました。AアプリケーションとBアプリケーション間の交換は次のようになります。
- AアプリケーションはAIDLインターフェースを介してBアプリケーションに接続します
- アプリケーションがBサービスのメソッドを呼び出す
- BサービスはPendingIntentを返します
- アプリケーションがPendingIntentを開始します
- Bアプリケーションでアクションが終了したら:Aアプリケーションに戻ります
ただし、交換前にBアプリケーションが起動された場合、ユーザーは、Aアプリケーションではなく、「finish()」メソッドを呼び出した後、Bアプリケーションの最後のアクティビティにリダイレクトされます。
私のAアプリケーションでは:
@Override
protected void onCreate(Bundle savedInstanceState) {
...
Intent i = new Intent();
i.setClassName(Utils.BILLING_PACKAGE,Utils.BILLING_INTERFACE);
try {
Boolean ret = bindService(i, mConnection, Context.BIND_AUTO_CREATE);
} catch (Exception e) {}
}
//ServiceConnection class
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder boundService) {
service = InBillingInterface.Stub.asInterface((IBinder) boundService);
Utils.debug(mContext, "connection status : "+ service );
}
public void onServiceDisconnected(ComponentName name) {
service = null;
}
};
...
//launch the second application
Bundle response = service.prepareForBillingService(data);
PendingIntent pIntent = response.getParcelable(Utils.RESPONSE_P_INTENT);
try {
Intent in = new Intent();
in.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
pIntent.send(mContext, 0, in);
} catch (PendingIntent.CanceledException e) {
Utils.error("Sending contentIntent failed:" + e.getMessage());
}
Aアプリケーションマニフェストファイルでandroid:launchModeをsingleTaskまたはsingleTopに設定しようとしましたが、問題は同じままです。ご覧のとおり、アクティビティを送信するときに「FLAG_ACTIVITY_MULTIPLE_TASK」フラグも設定します。
私のBアプリケーションのコード:
保留中のアクティビティの作成
public class InBillingService extends Service {
private static final String TAG = "my tag";
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "Welcome!");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "Byebye!");
}
/**
* Method for AIDL interface
*/
@Override
public IBinder onBind(Intent arg0) {
return new InBillingInterface.Stub() {
//a method that return a pendingIntent
@Override
public Bundle prepareForBillingService(String appId,String encryptedData) throws RemoteException {
Bundle bundle = new Bundle();
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
intent.setClass(InBillingService.this, xx.xxx.activities.BilingActivity.class);
intent.putExtra(Consts.PENDING_INTENT_INFO, result);
PendingIntent pendingIntent = PendingIntent.getActivity(InBillingService.this, 0, intent, 0);
bundle.putParcelable(Consts.PENDING_INTENT, pendingIntent);
return bundle ;
}
};
}
BillingActivityで
//if no problems
finish()
読んでくれてありがとう !
- -アップデート
Bアクティビティのマニフェストファイル:
<activity
android:name=".activities.BillingActivity"
android:configChanges="orientation|keyboardHidden"
android:launchMode="singleTask"
android:label="@string/title_activity_billing" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>