gpt4 book ai didi

android - 从 phonegap 调用电话后重新专注于主要 Activity

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:36 27 4
gpt4 key购买 nike

我正在构建一个基于 PhoneGAP 的应用程序,我需要在其中调用电话,然后在 5 秒后返回到我的应用程序。

关于调用电话的部分工作正常。为了让 Android 通过通话而不仅仅是拨号盘打开,调用电话的代码放在 com.phonegap.api.Plugin 中,看起来像

private void callNumber(String phoneNumber){
Uri calling = Uri.parse("tel:" + phoneNumber);
Intent callIntent = new Intent(Intent.ACTION_CALL, calling);
this.ctx.startActivity(callIntent);
}

为了重启应用程序,我在调用 RestartTask 之前启动了一个 AsyncTask。因为这段代码存在于插件中,所以我必须使用 Activity.runOnUiThread 来启动 RestartTask,但除此之外没有什么特别的。

在 RestartTask 中,只实现了 doInBackground 方法,它所做的只是休眠 5 秒,然后运行以下 Intent :

Intent restartIntent = new Intent(DialerPlugin.this.ctx.getBaseContext(), MainActivity.class);
restartIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
DialerPlugin.this.ctx.startActivity(restartIntent);

这里的MainActivity是PhoneGAP的派生主类,它扩展了DroidGap

设置 FLAG_ACTIVITY_CLEAR_TOP 和 FLAG_ACTIVITY_SINGLE_TOP 正是人们所说的 herehere应该设置,如果要“重新激活” Activity ,这意味着使用当前实例化 Activity 的任务而不是创建新任务,并且 Activity 以其运行状态重用,而不是创建新的 Activity 实例.当操作系统交付 Intent 时,“旧” Activity 将调用 onNewIntent

但是,当电话调用处于 Activity 状态时没有任何反应,并且似乎没有将 Intent 传递给 MainActivity,直到我挂断其中一部电话。很奇怪。

如果我更改标志以包含 FLAG_ACTIVITY_CLEAR_TOP,应用任务或主 Activity 将重新启动。然而,由于这是 PhoneGAP,两者都对应于重新启动应用程序,这不是我想要的。我还可以在另一个任务中使 Android 启动我的应用程序的全新实例,该任务已获得焦点。

但是我无法让 Android 将焦点返回到我的主要 Activity 。我做错了什么?

谢谢!

最佳答案

经过数小时的黑客攻击,我设法解决了这个问题。看起来,一旦一个新的 android 任务获得控制权,这就是使用内置拨号器调用电话时发生的情况,从调用电话的任务启动的后台任务也失去了启动新 Activity 的特权,除非它正在启动新任务中的 Activity 。

这意味着,AsyncTask 在进行调用之前从 Activity 启动,然后稍微休眠以确保拨号器任务/Activity 处于打开状态,它必须启动一个新任务以获得焦点。再次启动 Cordova Activity 不是一个选项,因为这会有效地重新启动整个应用程序,因此解决方案是创建一个精简重启任务,立即完成。

在Cordova插件中,可以放置如下内部类:

protected class RestartTask extends AsyncTask<Void, Void, Void>{
protected RestartTask() { }

@Override
protected Void doInBackground(Void... unused){
try {
// pass time so the built-in dialer app can make the call
Thread.sleep(MyPlugin.restartDelay);
}
catch (InterruptedException localInterruptedException)
{
Log.d("MyPlugin", "RestartTask received an InterruptedException");
}

return null;
}

@Override
protected void onPostExecute(Void justEyeCandy){
super.onPostExecute(justEyeCandy);

// Start the RestartActivity in a new task. This will snap the phone out of the built-in dialer app, which
// has started in it's own task at this point in time. The RestartActivity gains control and finishes
// immediately, leading control back to the activity at the top of the stack in the
// app (where the user came from when making the call).
Intent restartIntent = new Intent(MyPlugin.this.ctx.getApplicationContext(), RestartActivity.class);
restartIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MyPlugin.this.ctx.getApplicationContext().startActivity(restartIntent);
}
}

这个 AsyncTask 可以通过调用在插件中启动:

this.ctx.runOnUiThread(new Runnable(){
public void run(){
try {
RestartTask restartTask = new RestartTask();
restartTask.execute();
}
catch (Exception e) {
Log.d("MyPlugin", "Exploded when trying to start background task: " + e.getMessage());
}
}
});

AsyncTask 在新任务中启动的类是:

public class RestartActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// the prototype RestartActivity there is a possibility that this will be the root activity of the app.
// If that is the case, this activity will boot the main activity of the app in a new task, before signing off.
// However, this is not the case for this app, as restarts are only used once a call diversion has taken place,
// form within the app.
if (isTaskRoot())
{
// Start the app before finishing
String packageName = this.getBaseContext().getPackageName();
Intent startAppIntent = this.getBaseContext().getPackageManager().getLaunchIntentForPackage(packageName);
startAppIntent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
startActivity(startAppIntent);
}

// Now finish, which will drop the user in to the activity that was at the top of the task stack
finish();
}
}

关于android - 从 phonegap 调用电话后重新专注于主要 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10317890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com