2016-06-03 11 views
0

Wie man einen Dialog öffnet, wenn von irgendeinem nicht ui Modul wenn es unterschiedliche Aktivität im Display geben kann?android, wie man einen Dialog von irgendeinem nicht ui Modul knallt

Angenommen, es könnten mehrere Aktivitäten gestapelt sein, Activity_A, Activity_B, Activity_C. Das allgemeine Servicemodul kann auf einem nicht-ui-Thread ausgeführt werden und in den Fall führen, dass ein Dialog geöffnet werden muss.

Es könnte getan werden, indem Sie den Handler von allen aktiven Aktivitäten an das Modul übergeben und Nachricht senden, damit die Aktivität in den Popup-Dialog geht.

Aber das braucht etwas Management in Bezug auf die Übergabe der Handler und bestimmen, wer oben auf der Ansicht ist.

Gibt es einen besseren Weg?

+0

Implementieren Sie die Schnittstelle für es, wenn der Dienst das Dialogfeld anzeigen muss. –

+0

Danke Abdul! Das hat ein ähnliches Problem zu lösen, das ist, welche Aktivität zu rufen und zu verwalten, wer an der Spitze ist? Eine einfachere Lösung wäre besser. – lannyf

+0

Sie werden auch versuchen, Observer Design Pattern zu verwenden. –

Antwort

0

Nach dem Ausprobieren denke ich, dass es am einfachsten ist, Anwendungskontext zu verwenden, um eine Aktivität für den Dialog zu öffnen. Auf diese Weise wäre es egal, wer die aktuelle Aktivität an der Spitze ist.

Intent dialogIntent = new Intent(applicationCotext, DialogActivity.class); 
    dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    applicationCotext.startActivity(dialogIntent); 
+0

ja das wird auch funktionieren. –

0

können Sie zeigen dailog von Nicht-UI-Thread mit BroadcastReceiver

verstehen Fluss:

public class Sample extends Activity { 

    BroadcastReceiver updateUIReciver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     updateUIReciver = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       //UI update here 
       ShowFailedDailog(null, getString(R.string.mms_sending_service_failed_txt)); 
      } 
     }; 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction("update.from.nonui"); 
     registerReceiver(updateUIReciver, filter); 
    } 

    void ShowFailedDailog(String title, String message) { 
     final Dialog dialog = new Dialog(context); 
     dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     dialog.setContentView(R.layout.import_backup_popup); 

     TextView Save = (TextView) dialog.findViewById(R.id.tOk); 
     Save.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       dialog.dismiss(); 
      } 
     }); 
     TextView cancel = (TextView) dialog.findViewById(R.id.tCancel); 
     cancel.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       dialog.dismiss(); 
      } 
     }); 
     dialog.show(); 
    } 
} 

NON UI:

public class NonUiSerive extends Service { 
    Context context; 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     if (intent != null) { 

      // ..... your tasks 

      if (SomeFlagUpdateTrue) { 
       Intent local = new Intent(); 
       local.setAction("mms.seding.failed"); 
       context.sendBroadcast(local); 
      } 
     } 
     this.stopSelf(); 
     return 0; 
    } 

} 

Ähnlich registrieren Empfänger alle drei Klasse Es wird in jeder Aktivität aktualisiert, die nicht auf eins beschränkt ist.

+0

Danke Sohail !, Ähnliche Frage, welche Aktivität sollte es handhaben, da nicht wissen, welche oben ist, und nicht wirklich Broadcast-Dienst verwenden möchten. Der Ansatz von Abdul's Interface Face könnte dasselbe erreichen. Gute Wahl. – lannyf