BOOT_COMPLETED 没有收到我的物理 phone 华硕
BOOT_COMPLETED isn't received by my physical phone Asus
我测试了一个 BroadcastReceiver
,它在模拟器中运行 JobIntentService
,运行成功。
但是当我将代码测试到我的物理 phone ASUS ZE551ML 时它失败了。
清单文件:
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
<service android:name=".MyJobIntentService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false"/>
</application>
广播接收器class :
package com.packt.backgroundservicedemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Write Code..
if(Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Intent i = new Intent(context, MyJobIntentService.class);
i.putExtra("sleepTime", 12);
MyJobIntentService.enqueueWork(context,i);
// context.startService(i);
}
}
}
JobIntentServiceclass:
package com.packt.backgroundservicedemo;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v4.app.JobIntentService;
import android.util.Log;
import android.widget.Toast;
public class MyJobIntentService extends JobIntentService {
static final int JOB_ID = 15;
static void enqueueWork(Context context,Intent intent){
enqueueWork(context,MyJobIntentService.class,JOB_ID,intent);
}
private static final String TAG = MyJobIntentService.class.getSimpleName();
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this,"Task Execution Started",Toast.LENGTH_SHORT).show();
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
// Write code here..
Log.i(TAG,"onHandleWork(), Thread name:" + Thread.currentThread().getName());
int duration = intent.getIntExtra("sleepTime",-1);
int ctr = 1;
//Dummy long operation
while (ctr<=duration){
Log.i(TAG,"Time elapsed " + ctr + " secs");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ctr++;
}
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this,"Task Execution Finished",Toast.LENGTH_SHORT).show();
}
}
重复:代码在模拟器设备、Oreo 之前和 Oreo 设备上运行良好。
日志不包含任何与我的应用程序相关的boot_completed reveiced
。
谢谢。
我敢打赌 - 您的模拟器没有密码锁,而您的真实设备有。 BOOT_COMPLETED
仅在使用密码解锁后广播,您必须等待其他 BroadcastReceiver
接收此事件(注册此事件的其他应用程序),具体取决于您所在的位置在系统队列中。
有一个自动启动管理器应用程序在启动时拒绝我的应用程序 运行。
现在我的应用程序一开始就运行良好。
感谢@Arseny Levin 的提示。
我测试了一个 BroadcastReceiver
,它在模拟器中运行 JobIntentService
,运行成功。
但是当我将代码测试到我的物理 phone ASUS ZE551ML 时它失败了。
清单文件:
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
<service android:name=".MyJobIntentService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false"/>
</application>
广播接收器class :
package com.packt.backgroundservicedemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Write Code..
if(Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Intent i = new Intent(context, MyJobIntentService.class);
i.putExtra("sleepTime", 12);
MyJobIntentService.enqueueWork(context,i);
// context.startService(i);
}
}
}
JobIntentServiceclass:
package com.packt.backgroundservicedemo;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v4.app.JobIntentService;
import android.util.Log;
import android.widget.Toast;
public class MyJobIntentService extends JobIntentService {
static final int JOB_ID = 15;
static void enqueueWork(Context context,Intent intent){
enqueueWork(context,MyJobIntentService.class,JOB_ID,intent);
}
private static final String TAG = MyJobIntentService.class.getSimpleName();
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this,"Task Execution Started",Toast.LENGTH_SHORT).show();
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
// Write code here..
Log.i(TAG,"onHandleWork(), Thread name:" + Thread.currentThread().getName());
int duration = intent.getIntExtra("sleepTime",-1);
int ctr = 1;
//Dummy long operation
while (ctr<=duration){
Log.i(TAG,"Time elapsed " + ctr + " secs");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ctr++;
}
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this,"Task Execution Finished",Toast.LENGTH_SHORT).show();
}
}
重复:代码在模拟器设备、Oreo 之前和 Oreo 设备上运行良好。
日志不包含任何与我的应用程序相关的boot_completed reveiced
。
谢谢。
我敢打赌 - 您的模拟器没有密码锁,而您的真实设备有。 BOOT_COMPLETED
仅在使用密码解锁后广播,您必须等待其他 BroadcastReceiver
接收此事件(注册此事件的其他应用程序),具体取决于您所在的位置在系统队列中。
有一个自动启动管理器应用程序在启动时拒绝我的应用程序 运行。
现在我的应用程序一开始就运行良好。
感谢@Arseny Levin 的提示。