2013-03-18 3 views
1

Я связал 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> 
+0

Не знаю, как решить мою проблему? Я спешу, и я буду благодарен за вашу помощь. Спасибо – johann

+0

Разве приложение B не является сервисом? AIDL обычно используется как IPC в модели клиент/сервер. Поэтому я предполагаю, что приложение A является клиентом, а приложение B - сервером в виде услуги. Почему приложение B имеет связанную с ним деятельность? – Luis

+0

Приложение B содержит службу, которая возвращает pendingIntent для активности в приложении B. Является ли мое объяснение понятным? – johann

ответ

2

Для того, чтобы вернуться к заявке А после того, как BillingActivity заканчивается в заявке B, сделайте следующее:

В файл манифеста для приложения B, сделать BillingActivity launchMode singleInstance следующим образом:

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

За этим link:

«singleTask» и режимы «SingleInstance» также отличаются друг от друга только в одном отношении: Деятельность по «singleTask» позволяет другим деятельность, чтобы быть частью своей задачи. Это всегда лежит в основе задачи , но в эту задачу могут быть включены другие действия (обязательно «стандартные» и «одиночные» операции ). С другой стороны, деятельность «singleInstance» не позволяет никаким другим действиям быть частью задачи . Это единственное занятие в задаче. Если он запустит другое действие , это действие назначается другой задаче - как если бы FLAG_ACTIVITY_NEW_TASK был в намерении.

+0

Сделано! спасибо – johann

 Смежные вопросы

  • Нет связанных вопросов^_^