Android:在singleTop / singleTask模式下绑定应用程序(AIDL)

时间:2013-03-18 09:35:16

标签: android aidl back-stack launchmode

我已经使用AIDL文件绑定了两个Android应用程序。 A和B应用程序之间的交换如下:

  • A应用程序通过AIDL连接到B应用程序 接口
  • 应用程序调用B服务的方法
  • B服务返回PendingIntent
  • 应用程序启动PendingIntent
  • 在B应用程序中完成操作后:返回A 应用

但是,如果在交换之前启动了B应用程序,则在调用“finish()”方法之后,用户将被重定向到B应用程序的最后一个活动,而不是在A应用程序中。

在我的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申请中的代码:

创建PendingActivity

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>

1 个答案:

答案 0 :(得分:2)

为了在BillingActivity在应用程序B中完成后返回应用程序A,请执行以下操作:

在Application B的清单文件中,按照以下方式制作BillingActivity launchMode singleInstance:

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

根据此link

  

“singleTask”和“singleInstance”模式也各不相同   另外一方面:“singleTask”活动允许其他方面   活动成为其任务的一部分。它始终是它的根源   任务,但其他活动(必然“标准”和“singleTop”   活动)可以启动到该任务中。一个“单一实例”   另一方面,活动不允许其他活动成为其中的一部分   它的任务。这是任务中唯一的活动。如果它开始另一个   活动,该活动被分配给不同的任务 - 就好像   FLAG_ACTIVITY_NEW_TASK是故意的。