Я связал 2 приложения Android с файлом AIDL. Обмен между приложениями А и В, как показано ниже:Android: привязывать приложения (AIDL) в singleTop/singleTask Mode
- приложение подключается к приложению B через AIDL интерфейс
- приложение вызывает метод сервиса B
- B сервис возвращает PendingIntent
- приложение запускает PendingIntent
- Когда действие закончено в приложении B: назад к приложению
Однако, если приложение B было запущено до обмена, пользователь будет перенаправлен на последнюю активность приложения B после вызова метода «finish()», а не в приложении 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());
}
Я пытался установить андроид: 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>
Не знаю, как решить мою проблему? Я спешу, и я буду благодарен за вашу помощь. Спасибо – johann
Разве приложение B не является сервисом? AIDL обычно используется как IPC в модели клиент/сервер. Поэтому я предполагаю, что приложение A является клиентом, а приложение B - сервером в виде услуги. Почему приложение B имеет связанную с ним деятельность? – Luis
Приложение B содержит службу, которая возвращает pendingIntent для активности в приложении B. Является ли мое объяснение понятным? – johann