1

我用 AIDL 文件绑定了 2 个 android 应用程序。A和B应用程序之间的交换如下:

  • A应用通过AIDL接口连接到B应用
  • A应用调用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 ;

}

    };

    }

在计费活动中

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

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

在应用程序 B 的清单文件中,使 BillingActivity 启动模式 singleInstance 如下所示:

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

根据此链接

“singleTask”和“singleInstance”模式也仅在一个方面彼此不同:“singleTask”活动允许其他活动成为其任务的一部分。它始终位于其任务的根部,但其他活动(必须是“标准”和“singleTop”活动)可以启动到该任务中。另一方面,“singleInstance”活动不允许其他活动成为其任务的一部分。这是任务中的唯一活动。如果它启动另一个活动,则该活动被分配给不同的任务——就好像 FLAG_ACTIVITY_NEW_TASK 在意图中一样。

于 2013-04-02T04:45:40.797 回答