我已经使用AIDL文件绑定了两个Android应用程序。 A和B应用程序之间的交换如下:
但是,如果在交换之前启动了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>
答案 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是故意的。