【问题标题】:Speed up the startup of BroadcastReceiver at reboot重启时加速 BroadcastReceiver 的启动
【发布时间】:2017-02-24 20:24:43
【问题描述】:

我有一个应用程序,用户可以调用自定义锁定屏幕来锁定他/她的手机,这是一个名为LockScreen.class 的活动。 一个这个屏幕被加载,即设备被锁定,一个名为IsLockedSharedPreferences被分配为真。 一旦用户在锁定屏幕上做他需要的事情,这个islocked就变成了假的,手机就恢复正常了。

一切都按预期正常工作。

问题是,如果由于某种原因手机在lock 屏幕处于活动状态时已重新启动,则它不会在重新启动后重新运行。

所以,我创建了一个BootReciever,如下所示,这工作正常,但在完成重启过程后,用户可以在加载之前做很多事情,我的问题是how can I make it loaded faster?,以便手机屏幕被锁定在让用户有机会使用移动设备做任何事情之前再次使用自定义活动?

public class BootReciever extends BroadcastReceiver
{

    SharedPreferences mPrefs;
    final String IsLockedPref = "IsLocked";

    @Override
    public void onReceive(Context context, Intent intent) {

        mPrefs = PreferenceManager.getDefaultSharedPreferences(context);
        Boolean islocked = mPrefs.getBoolean(IsLockedPref, false);

        Intent i;
        if (islocked)
            i = new Intent(context, LockScreen.class);
        else
            i = new Intent(context, MainActivity.class);

        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}

清单文件的一部分是:

<receiver android:name=".BootReciever"
          android:enabled="true"
          android:exported="true">
     <intent-filter >
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
     </intent-filter>
</receiver>

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

更新

我试图通过添加以下内容来授予Device Admin 来使用this,但没有任何改进:

在主Activity中:

    private static final int ADMIN_INTENT = 15;
    private static final String description = "Some Description About Your Admin";
    private DevicePolicyManager mDevicePolicyManager;
    private ComponentName mComponentName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

       mDevicePolicyManager = (DevicePolicyManager)getSystemService(
                this.DEVICE_POLICY_SERVICE);
        mComponentName = new ComponentName(this, AdminReceiver.class);
        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mComponentName);
        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,description);
        startActivityForResult(intent, ADMIN_INTENT);
.
.
}

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == ADMIN_INTENT) {
            if (resultCode == RESULT_OK) {
                Toast.makeText(getApplicationContext(), "Registered As Admin", Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(getApplicationContext(), "Failed to register as Admin", Toast.LENGTH_SHORT).show();
            }
        }
    }

并创建空接收器以将 DeviceAdminReceiver 扩展为:

public class AdminReceiver extends DeviceAdminReceiver {

}

并将以下内容添加到清单中:

<receiver
    android:name="AdminReceiver"
    android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data
        android:name="android.app.device_admin"
        android:resource="@xml/admin"/>

    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>

【问题讨论】:

    标签: java android android-intent broadcastreceiver


    【解决方案1】:

    您可以做的一件事是为您的intent-filter 设置优先级。来自documentation

    它控制执行广播接收器以接收广播消息的顺序。具有较高优先级值的那些在具有较低值的那些之前被调用。

    <intent-filter 
        android:priority="100">
            ...
    </intent-filter>
    

    该值必须是整数,例如“100”。数字越大优先级越高。默认值为 0。该值必须大于 -1000 且小于 1000。

    【讨论】:

    • 非常感谢,在我的情况下 100 还不够快,所以我使用了 999,现在我可以接受了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多