2013-06-14 4 views
0

У меня есть собственный класс активности диалогового окна, который я вызываю, когда мне нужно показать строку ожидания для определенного процесса, после чего я называю его методом завершения, но Я не могу закончить эту деятельность там, или я не знаю, как назвать этот метод завершения, но я вызываю его через объект класса, мой код для WaitDialogManager класс ниже. И я не хочу использовать широковещательный приемник для этого ...Как закончить действие из класса неактивности, где он был запущен

WaitDialogManager

пакет com.android.remotewipedata;

импорт android.app.Activity; import android.os.Bundle; импорт android.view.Window; импорт android.widget.TextView;

общественный класс WaitDialogManager расширяет активность {

TextView waitTitle, waitMessage; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.wait_dialog); 

    String title = getIntent().getStringExtra("waitDialogTitle"); 
    String message = getIntent().getStringExtra("waitDialogMessage"); 

    waitTitle = (TextView) findViewById(R.id.wait_dialog_title); 
    waitMessage = (TextView) findViewById(R.id.wait_dialog_message); 
    waitTitle.setText(title); 
    waitMessage.setText(message); 
} 

public void dismissWaitDialog(){ 
    this.finish(); 
    System.out.println("Finish Called"); 
} 
} 

и это, где я называю эту деятельность и пытается закончить его после завершения метода, код для этого класса не-активность ниже

ServerUtilities

public final class ServerUtilities { 
    //Other code 
public static WaitDialogManager wdManager = new WaitDialogManager(); 

static boolean register(final Context context, String name, String email, 
     final String regId) { 

      // Starting WaitDialogManager activity here 
    context.startActivity(new Intent(context, WaitDialogManager.class) 
      .putExtra("waitDialogTitle", "Please wait...") 
      .putExtra("waitDialogMessage", 
        "Registering device on Server...") 
      .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 

    String serverUrl = SERVER_URL + "/register.php"; 
    Map<String, String> params = new HashMap<String, String>(); 
    params.put("regId", regId); 
    params.put("name", name); 
    params.put("email", email); 

    // Try to register on server for a number of times 
    long backoff = BACKOFF_MILLI_SECONDS + random.nextInt(1000); 
    for (int i = 1; i <= MAX_ATTEMPTS; i++) { 
     try { 
      post(serverUrl, params); 
      System.out.println("Parameters: " + params); 
      GCMRegistrar.setRegisteredOnServer(context, true); 
      return true; 
     } catch (IOException e) { 
      if (i == MAX_ATTEMPTS) { 
       break; 
      } 
      try { 
       Thread.sleep(backoff); 
      } catch (InterruptedException e1) { 
       Thread.currentThread().interrupt(); 
       return false; 
      } 
      backoff *= 2; 
     } 
    } 
    wdManager.dismissWaitDialog(); 
    return false; 
} 

для этого диалогового окна, чтобы исчезнуть меня вручную Clic k, чтобы она исчезла, я хочу, чтобы она уклонилась/исчезла, когда метод register() достиг своего конца. Спасибо

+1

понадобится контекст класса активности, а затем вызвать context.finish(); – Raghunandan

+0

как мне получить этот контекст? Я попытался вызвать метод, возвращающий контекст этого класса, но тот же результат. – Saqib

+0

Вы не можете получить контекст, это нецелесообразно. Даже если бы вы могли, я подозреваю, что 'finish()' на самом деле не выполнит, действие вернется в рабочее состояние, а это значит, что вы можете просто сделать то, что я рекомендовал в своем ответе, и использовать 'startActivityForResult'. – Ali

ответ

0

Я решил это, взяв статическую ссылку текущей деятельности от WaitDialogManager, как показано ниже. В WaitDialogManager классе объявить статическую Activity ссылку,

public class WaitDialogManager extends Activity { 

public static Activity context = null; // Current Activity 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.wait_dialog); 
      .... 
} 
} 

И назвав его в ServerUtilities, как удар,

public final class ServerUtilities { 
//Other code 

static boolean register(final Context context, String name, String email, 
    final String regId) { 

     // Starting WaitDialogManager activity here 
     context.startActivity(new Intent(context, WaitDialogManager.class) 
     .putExtra("waitDialogTitle", "Please wait...") 
     .putExtra("waitDialogMessage", 
       "Registering device on Server...") 
     .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 

String serverUrl = SERVER_URL + "/register.php"; 
Map<String, String> params = new HashMap<String, String>(); 
params.put("regId", regId); 
params.put("name", name); 
params.put("email", email); 

// Try to register on server for a number of times 
long backoff = BACKOFF_MILLI_SECONDS + random.nextInt(1000); 
for (int i = 1; i <= MAX_ATTEMPTS; i++) { 
    try { 
     post(serverUrl, params); 
     System.out.println("Parameters: " + params); 
     GCMRegistrar.setRegisteredOnServer(context, true); 
     WaitDialogManager.context.finish(); // And this is how it works 
     return true; 
    } catch (IOException e) { 
     // Exception handled 
    } 
} 
return false; 
} 
0

По моему опыту вы технически не можете этого сделать. Что вы можете сделать, это запустить второе действие с startActivityForResult, а затем, когда ваше второе действие закончится, вы можете передать флаг, указывающий, что вызывающая активность должна выйти. Этот процесс будет настолько быстрым, что пользователь не сможет сказать, что вызывающая активность все еще открыта. Если первая/вызывающая деятельность всегда должна выйти, то в манифесте вы можете установить для этой операции android:noHistory="true".

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