1

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>
4

1 に答える 1

2

BillingActivity がアプリケーション B で終了した後にアプリケーション A に戻るには、次の手順を実行します。

アプリケーション B のマニフェスト ファイルで、BillingActivity launchMode singleInstance を次のようにします。

<activity
    android:name="xx.xxx.activities.BillingActivity"
    android:launchMode="singleInstance" >
</activity>

このリンクごと:

また、「singleTask」モードと「singleInstance」モードは、1 つの点でのみ互いに​​異なります。「singleTask」アクティビティでは、他のアクティビティをそのタスクの一部にすることができます。これは常にそのタスクのルートにありますが、他のアクティビティ (必然的に「標準」および「singleTop」アクティビティ) をそのタスクに起動できます。一方、「singleInstance」アクティビティでは、他のアクティビティをそのタスクの一部にすることはできません。タスク内の唯一のアクティビティです。別のアクティビティを開始すると、そのアクティビティは別のタスクに割り当てられます — FLAG_ACTIVITY_NEW_TASK がインテントに含まれているかのように。

于 2013-04-02T04:45:40.797 に答える