安卓如何将活动带到前台

5
我们有一个要求,需要我们的应用程序始终处于顶部。实际上,我们需要为设备创建一个展示模式。这些设备将提供给用户,因此他们只在设备上使用我们的应用程序。
我们已经研究了捕获所有可能的键事件,例如用户按Home和Search键,但这种方法似乎非常困难。
我们决定尝试使用我们的应用程序创建一个服务来监视最高优先级的进程,如果不是我们的应用程序,则将其返回到顶部。我们卡在了将我们的应用程序置于顶部的部分。尝试使用StartActivity()时,什么也没有发生。我们认为可以以同样的方式调用我们的活动,就像主屏幕启动器那样。
我们已经审查了所有相关的帖子,但还没有找到正确的解决方案。如果有更好的方法,请告诉我!
非常感谢。

多讨厌啊!来电时会发生什么?在展示模式下设备无法接听电话?这听起来很糟糕,你应该考虑使用定制 ROM 代替。 - EboMike
3
它不会有电话套餐,只是一个数据收集设备。它不必完全锁定设备的使用,只需防止人们将其用于其他目的即可。 - user713930
2个回答

2
这些设备将提供给用户,使他们只在设备上使用我们的应用程序。
唯一完全有效的方法是您自己制造设备。
我们决定尝试创建一个服务与我们的应用程序,以监视最顶层的进程,如果不是我们的应用程序,则将其返回到顶部。我们卡在了把我们的应用程序带到最上面的部分。当尝试使用StartActivity()时,没有任何反应。我们认为可以通过与主屏幕启动器调用我们的活动相同的方式来完成此操作。
为什么不把你的应用程序作为主屏幕呢?这样,按下HOME键的任何人都会进入你的应用程序。
当然,除非您自己制造设备并将您的应用程序作为固件的主屏幕,否则用户可以将这些设备重新启动到“安全模式”并删除您的应用程序。

从技术上讲,您不必自己制造它,但它将需要定制的ROM。 - EboMike
@EboMike:没错,但我假设/希望/什么的,OP不会分发任何已经过保修期的硬件。也许他们会自己保证设备或其他什么。 - CommonsWare
谢谢大家,我更倾向于不选择这种方式来解决保修问题,同时也希望能够灵活地转移到其他硬件上。他们真的只是不希望用户浏览网页等。如果他们有任何技术能力并且能够自己解决问题,那么这就不是一个问题。 - user713930

1

我正在开发一个应用程序,它必须是无法退出的。这是因为这个应用程序是由交通执法人员使用的,而不是用于日常通话,我们必须确保他们不会退出我们的应用程序并在工作时上网冲浪。

因此,您必须将此放入您的清单中:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.droid"
      android:versionCode="1"
      android:versionName="1.0">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.GET_TASKS"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.SET_WALLPAPER" />
    <uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" /> 

    <application 
        persistent="true"
        android:icon="@drawable/icon" 
        android:label="@string/app_name" 
        android:debuggable="true">
        <activity android:name=".YourActivity"
                  android:label="@string/app_name"
                  android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                  android:imeOptions="actionSend|flagNoEnterAction"
                  android:configChanges="keyboardHidden|orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.HOME"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <receiver android:name="BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.HOME" />
            </intent-filter>
        </receiver> 
    </application>
</manifest> 

您需要在应用程序中放置一个引导接收器类:

(BootReceiver.java)

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent arg1) {
        Intent startupIntent = new Intent(context, YourActivity.class);
        startupIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(startupIntent);
    }

}

接下来你需要在你的Activity中禁用所有按钮:

/**
 * This method disables all buttons.   
 */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    return true;
}

/**
 * This method disables all buttons.
 */
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    return true;
}

现在你已经拥有了一个应用程序的基础,即使用户按下主页按钮也无法退出,如果他重新启动手机,你的应用程序将在启动完成后立即运行。现在,只有当他拥有adb(并且你开启了usb调试),或者他强制重置手机时,才能清除你的应用程序。

如果以下代码不清楚或者我留下了一些错误,请随时提问。顺便说一句,在...-s中,你必须用自己的代码替换它。

编辑:更正了xml。


明天我会检查这个,更准确地说(现在我在家)。 - Adam Arold
如果用户在获取电话号码后让其他人打电话怎么办?长按HOME按钮切换任务怎么办?长按相机按钮切换到相机应用程序怎么办?(也许其中一些被onKey*处理程序所覆盖,但我不太确定。)通过market.android.com安装应用程序怎么办(假设已知连接的gmail帐户)? - EboMike
@edem:根据您列出的清单,HOME按钮仍应该有效。您需要让其中一个活动使用“HOME”类别,并配置为默认主屏幕。此外,您仍然需要处理安全模式恢复对设备自己主屏幕的访问,以及您所提到的漏洞。我不太确定您的启动时BroadcastReceiver能为您带来什么好处,但可能有些我在那里忽略了的东西。 - CommonsWare
谢谢,我可以尝试这种方法。我只是以为捕捉所有可能的情况会太困难了。不过我知道一个叫做Toddlerlock的应用程序已经成功做到了这一点。 - user713930
很不幸,我认为这种方法会非常具有挑战性,因为我需要允许用户选择菜单和其他键。我之所以选择将应用程序置于顶部的路线,是为了为用户提供一种临时退出并执行其他必要操作(例如设置WiFi连接等)的方式,然后在X分钟后恢复。如果有人能告诉我为什么我可以从服务中启动我的活动,那就太好了。 - user713930
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接