Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中,在不启动MainActivity的情况下处理该命令_Java_Android_Android Activity_Screen - Fatal编程技术网

Java 在Android中,在不启动MainActivity的情况下处理该命令

Java 在Android中,在不启动MainActivity的情况下处理该命令,java,android,android-activity,screen,Java,Android,Android Activity,Screen,我是android新手,我的新屏幕关闭测试应用程序一度陷入困境。我正在尝试开发一个Android应用程序,通过单击应用程序的应用程序启动程序图标直接关闭或锁定屏幕 我可以用我想要的功能锁定屏幕,但有一个问题。当我点击启动程序中的屏幕锁定图标时,大约需要一秒钟的时间,然后锁定屏幕(时间由MainActivity启动) 我希望时间延迟被删除,只是想处理命令锁定手机时,用户点击应用程序图标在启动器。但是我没办法弄明白 这里是AndroidManifest.xml <application

我是android新手,我的新屏幕关闭测试应用程序一度陷入困境。我正在尝试开发一个Android应用程序,通过单击应用程序的应用程序启动程序图标直接关闭或锁定屏幕

我可以用我想要的功能锁定屏幕,但有一个问题。当我点击启动程序中的屏幕锁定图标时,大约需要一秒钟的时间,然后锁定屏幕(时间由MainActivity启动)

我希望时间延迟被删除,只是想处理命令锁定手机时,用户点击应用程序图标在启动器。但是我没办法弄明白

这里是AndroidManifest.xml

<application
    android:theme="@android:style/Theme.NoDisplay"
    android:label="@string/app_name"
    android:icon="@drawable/ic_launcher"
    android:allowBackup="true">

    <activity android:name=".MainActivity"
        android:excludeFromRecents="true"
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver android:name="ScreenOffAdminReceiver"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
        <meta-data android:name="android.app.device_admin"
            android:resource="@xml/permissions" />
        <intent-filter>
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
        </intent-filter>
    </receiver>

</application>
<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <force-lock />
    </uses-policies>
</device-admin>
ScreenOffAdminReceiver.java

public class MainActivity extends Activity {

    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        DevicePolicyManager deviceManger = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
        ComponentName compName = new ComponentName(this, ScreenOffAdminReceiver.class);
        if (deviceManger.isAdminActive(compName)) {
            deviceManger.lockNow();
            finish();
        } else {
            Intent intent = new Intent("android.app.action.ADD_DEVICE_ADMIN");
            intent.putExtra("android.app.extra.DEVICE_ADMIN", compName);
            intent.putExtra("android.app.extra.ADD_EXPLANATION", getString(R.string.devicePolicyManagerMsg));
            startActivityForResult(intent, 0);
        }
        Process.killProcess(Process.myPid());
    }
}
public class ScreenOffAdminReceiver extends DeviceAdminReceiver {
    public void onDisabled(Context context, Intent intent) {
        Toast.makeText(context, R.string.deviceAdminDisabled, Toast.LENGTH_SHORT).show();
    }

    public void onEnabled(Context context, Intent intent) {
        Toast.makeText(context, R.string.deviceAdminEnabled, Toast.LENGTH_SHORT).show();
    }
}
permissions.xml

<application
    android:theme="@android:style/Theme.NoDisplay"
    android:label="@string/app_name"
    android:icon="@drawable/ic_launcher"
    android:allowBackup="true">

    <activity android:name=".MainActivity"
        android:excludeFromRecents="true"
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver android:name="ScreenOffAdminReceiver"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
        <meta-data android:name="android.app.device_admin"
            android:resource="@xml/permissions" />
        <intent-filter>
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
        </intent-filter>
    </receiver>

</application>
<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <force-lock />
    </uses-policies>
</device-admin>


我只想在锁定屏幕时消除延迟。我们将非常感谢您的帮助。谢谢

我认为你应该使用应用程序类

public class MainApplication  extends Application {
 @Override
    public void onCreate() {
        super.onCreate();
/*
        you should code here */
}

}

您可以尝试通过更改主题设置来缩短应用程序启动时间(创建活动):

尝试在应用程序样式中使用:

<item name="android:windowDisablePreview">true</item>
<item name="android:windowContentOverlay">@null</item>
true
@空的

我想这会对你有所帮助

public class MainActivity extends AppCompatActivity {

    DevicePolicyManager deviceManger;
    ComponentName compName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        deviceManger = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
        compName = new ComponentName(this, ScreenOffAdminReceiver.class);
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (deviceManger.isAdminActive(compName)) {
            deviceManger.lockNow();
            finish();
        } else {
            Intent intent = new Intent("android.app.action.ADD_DEVICE_ADMIN");
            intent.putExtra("android.app.extra.DEVICE_ADMIN", compName);
            intent.putExtra("android.app.extra.ADD_EXPLANATION", "Device Policies");
            startActivityForResult(intent, 0);
        }
    }
}

我认为,只要你的“触发器”点击应用程序启动器图标,你就无法实现接近零的响应时间,原因有二:

  • 当你点击应用程序图标时,一个请求被发送到“系统”(如果你想了解更多信息,它被称为合子过程)。 然后,系统为应用程序创建要运行的进程,然后才启动应用程序。 这肯定需要一些时间

  • 第一个要执行的代码是你的应用程序
    onCreate()
    方法,但是如果你的应用程序仍然保存在后台/手机内存中,那么当你点击应用程序启动程序图标时,这个方法就不会被执行,所以这个解决方案并不是你想要的


  • 我认为如果你不需要从应用程序中锁定屏幕,而可以创建一个小部件来完成同样的操作,那么速度会更快。它将更快、更高效。

    您能否共享
    权限.xml
    ?您是否尝试过不执行
    Process.killProcess(Process.myPid())
    ?我觉得这可能会产生一些问题。是的,我也尝试过不使用它,但当某个新应用程序打开时,进程会自动终止,同样的问题再次出现。您是否特别在一个/特定设备上遇到过这种情况?@kanudo正确的方法是,抛出简单的
    小部件
    ,其他应用程序就是这样工作的。您创建小部件作为图标,当您与它们交互时抛出简单的单击,您通过一些操作将
    pendingent
    发送给另一个
    BroadcastReceiver
    。这一切都尽可能快地执行。我试过了,它只是把时间缩短了一半。有没有办法让这个过程持续下去。因为这就是应用程序不必每次都加载的方式,因此启动应用程序的时间会被删除。是的,你是对的,但我喜欢将图标放在Dock中,想要一种应用程序的感觉,而不是小部件的感觉。