2017-06-26 35 views
3

我刚接触android,并在我的新屏幕关闭测试应用程序时停留在某一点。我正在尝试开发一个Android应用程序,通过单击应用程序的应用程序启动器图标直接关闭或锁定屏幕。在不启动MainActivity的情况下处理该命令,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> 

MainActivity.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()); 
    } 
} 

ScreenOffAdminReceiver.java

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

<?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> 

我只想当锁定屏幕移除延迟。任何帮助将不胜感激。由于

+0

你能分享'permissions.xml'吗? – azizbekian

+0

您是否尝试过不执行'Process.killProcess(Process.myPid())'?我觉得它可能会造成一些问题。 – azizbekian

+0

是的,我没有它也尝试过,但是当一些新的应用程序打开,然后过程会自动死亡,并再次出现同样的问题 – kanudo

回答

4

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

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

} 
+0

我试过了,它只是减少了一半的时间。有什么办法可以保持这个过程的连续性。因为这是应用程序不必每次加载的方式,因此启动应用程序的时间将被删除。 – kanudo

2

您可以尝试减少应用程序启动的时间(创建活动)有变化的主题设置:

尝试使用你的应用风格:

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

我认为这会帮助你。

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); 
     } 
    } 
} 
0

我不认为你可以接近零响应时间,只要实现作为你的“触发”是在应用程序启动器图标点击以下两个原因:当你点击应用

  1. 图标的请求被发送到“系统”(如果你想了解更多关于它的信息 - 这就是所谓的zygote进程)。 然后系统会为您的应用程序创建运行流程,然后才会启动该应用程序。 这保证需要一些时间。

  2. 要执行的第一个代码为您的应用程序onCreate()方法,但如果您的应用程序仍保存在后台/手机内存上的应用程序启动器图标,当点击该方法将不会被执行,因此该解决方案是不是真的你在找什么。

0

我认为它会更快,如果不是从应用程序锁定屏幕,你可以创建一个小部件来做同样的事情。它会更快,更高效。 This might help you

+0

是的你是对的,但我喜欢在Dock中有图标,并希望有一个应用程序的感觉,而不是一个小部件的感觉。 – kanudo

相关问题