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