Android 如何从活动开始的非活动类中完成活动
我有一个自定义对话框活动类,当我必须显示某个特定进程的等待栏时调用它,之后我调用它的finish方法,但我无法在那里完成该活动,或者我不知道如何调用finish方法,但我通过类的对象调用它,Android 如何从活动开始的非活动类中完成活动,android,android-activity,android-alertdialog,Android,Android Activity,Android Alertdialog,我有一个自定义对话框活动类,当我必须显示某个特定进程的等待栏时调用它,之后我调用它的finish方法,但我无法在那里完成该活动,或者我不知道如何调用finish方法,但我通过类的对象调用它,WaitDialogManager类的代码如下。我不想用广播接收器来做这个 WaitDialogManager 包com.android.remotewipedata 导入android.app.Activity; 导入android.os.Bundle; 导入android.view.Window; 导入a
WaitDialogManager
类的代码如下。我不想用广播接收器来做这个
WaitDialogManager
包com.android.remotewipedata
导入android.app.Activity;
导入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");
}
}
这就是我调用这个活动并试图在方法完成后完成它的地方,非活动类的代码如下
服务器实用程序
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;
}
公共最终类服务器实用程序{
//其他代码
公共静态WaitDialogManager wdManager=新的WaitDialogManager();
静态布尔寄存器(最终上下文、字符串名称、字符串电子邮件、,
最终字符串(regId){
//正在此处启动WaitDialogManager活动
新意图(上下文,WaitDialogManager.class)
.putExtra(“waitDialogTitle”,“请稍候…”)
.putExtra(“waitDialogMessage”,
“正在服务器上注册设备…”
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
字符串serverUrl=SERVER_URL+“/register.php”;
Map params=新的HashMap();
参数put(“regId”,regId);
参数put(“名称”,名称);
参数put(“电子邮件”,电子邮件);
//尝试在服务器上注册多次
长退避=退避毫秒+随机.nextInt(1000);
对于(inti=1;i,根据我的经验,从技术上讲,你不能这样做。
但是,您可以做的是使用startActivityForResult
启动第二个活动,然后当第二个活动完成时,您可以传回一个标志,指示调用活动应该退出。此过程将非常快,用户将无法判断调用活动是否仍处于打开状态。如果第一个/调用活动应始终退出,然后在清单中,您可以为活动设置android:noHistory=“true”
。我通过从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
中调用它,就像blow一样
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;
}
公共最终类服务器实用程序{
//其他代码
静态布尔寄存器(最终上下文、字符串名称、字符串电子邮件、,
最终字符串(regId){
//正在此处启动WaitDialogManager活动
新意图(上下文,WaitDialogManager.class)
.putExtra(“waitDialogTitle”,“请稍候…”)
.putExtra(“waitDialogMessage”,
“正在服务器上注册设备…”
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
字符串serverUrl=SERVER_URL+“/register.php”;
Map params=新的HashMap();
参数put(“regId”,regId);
参数put(“名称”,名称);
参数put(“电子邮件”,电子邮件);
//尝试在服务器上注册多次
长退避=退避毫秒+随机.nextInt(1000);
对于(int i=1;i),您需要活动类的上下文,然后调用context.finish();如何获取该上下文?我尝试调用一个返回该类上下文的方法,但结果相同。您无法获取上下文,它不可分包。即使可以,我怀疑finish()
不会实际执行活动是否会返回到运行状态,这意味着您可以按照我在回答中的建议执行并使用startActivityForResult
。我调用它的类是非活动类。我如何从那里启动该方法?startActivityForResult()?