- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在构建一个基于 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 正是人们所说的 here和 here应该设置,如果要“重新激活” 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/
Example image 如何在 Phonegap 中添加像这张图片这样的 float 气泡通知。 最佳答案 没有您正在寻找的“开箱即用”插件。但是,您可以创建自己的插件或简单地使用 phonega
我正在使用 HTML 和 JS、JQuery Mobile 构建一个应用程序,并使用 PhoneGap Build 进行打包。客户想知道是否可以添加打印功能...有人知道吗?没有 PG Build 打
我已经安装了 Phonegap 使用 $ npm install -g PhoneGap 我也创建了项目。之后我做了 $ PhoneGap build android 它给出了 [phonegap]
我尝试创建 Phonegap 项目,其中需要集成 ASIHTTPRequest 和 JASON 引用, 并出现以下错误 ld: duplicate symbol _SBJSONErrorDomain
我有一个 Phonegap 应用程序,我从早期版本的 Phonegap 开始,我想升级到最新版本。我需要采取哪些步骤来升级它? 我正在寻求一般性答案,但我的具体情况是 Phonegap 1.1.0 -
我已在我的 MAC 电脑(IOS 10.5.8,SDK 3.1.2)上成功安装 PhoneGap。尝试创建一个新的基于 PhoneGap 的应用程序,包含 PhoneGap 框架并将所需的文件复制到
我正在 phonegap 中为三个不同的平台构建一个应用程序:Android、iOS 和 Blackberry。这样做时,我必须检测设备类型,以便我可以在不同平台和不同设备(如 Android Pho
开始在Mac上使用phonegap(Xcode 4,构建iPhone应用程序)我已经阅读了很多有关名为phonegap.plist的文件的内容,包括外部URL的白名单和其他内容。 这是我的问题,我在
所以我有一个运行 Phonegap 1.4.0 的应用程序(不要问),我决定升级到 1.8.1,这样做时 Phonegap 全局变量不再存在,将被替换为实用程序。 所以我转换了每一次出现: var t
我尝试了什么: 我正在开发一个安卓应用程序。在我的应用程序中,我必须打开 -> 向用户显示 Microsoft Office 文档(doc、docx、xls、xlsx、ppt、pptx)内容。为此,我
使用phonegap制作iOS应用时,ChildBrowser插件可以打开一个可以使用phonegap功能的远程页面吗? 例如:在phonegap应用程序中的index.html,调用childbro
我有一个带有 angularjs 的网络应用程序。我想使用 phonegap 将它变成一个移动应用程序 (android)。 我使用了 phonegap 构建:https://build.phoneg
我正在使用 Phonegap build 为每个平台生成可执行文件。每次更改代码时,我都必须在 phonegap build 上上传代码并生成新的 Apk 文件(适用于 android)。我不想在真实
我很生气,这是毫无疑问的,除了明显的可见差异之外,有人报告高度为: $('body').outerHeight(); //1780 与在我的本地 Windows 8 机器上使用 phonegap
我最近使用 phonegap 完成了我的第一个混合应用程序项目。当谈到公开测试时,我有点害怕签名过程。我从这里以及网上的其他地方阅读了许多不同的建议 fragment 来完成这项工作。 以下是如何为
我是 phonegap 的新手,我尝试创建一个简单的 phonegap 应用程序。 使用命令行安装phonegap后:--- 我已经成功创建了项目,但是当我尝试运行 phonegap build io
我正在为 Android 平台制作一个 phonegap 应用程序。在这个应用程序中,我想在多个 html 页面中滑动导航。请告诉我该怎么做。要么在单个 html 页面中完成,要么我必须为此滑动导航创
是否有任何插件可用于 Juce我可以添加哪些库可以同时适用于 IOS 和 android?如果没有,我如何集成 Juce我的电话间隙应用程序中的库? 最佳答案 没有插件。但您可以使用介绍榨汁机来创建不
Phonegap 刚刚推出了一种方法,可以使用以下命令使用本地服务器立即查看您对 phonegap 应用程序的更改: phonegap serve 然后通过下载 PhoneGap Developer
我们对如何集成phonegap插件,然后使用phonegap build构建我们的移动应用程序有一些疑问,这可能吗? 当您使用 Phonegapbuild 构建您的应用程序时,它会为所有受支持的设备构
我是一名优秀的程序员,十分优秀!