アプリケーションがフォアグラウンド、バックグラウンド、または強制終了している場合、アプリケーションは予期される動作を示します。 AndroidManifest
でリブート後にGCMNetworkManagerがPeriodicTaskを実行していません
:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<service android:name=".tracking.MyTaskService"
android:exported="true"
android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
<intent-filter>
<action android:name="com.google.android.gms.gcm.ACTION_TASK_READY" />
</intent-filter>
</service>
PeriodicTaskの設定:
PeriodicTask task = new PeriodicTask.Builder()
.setService(MyTaskService.class)
.setTag(TASK_TAG_PERIODIC)
.setPeriod(30L)
.setFlex(10L)
.setExtras(bundle)
.setPersisted(true)
.build();
mGcmNetworkManager.schedule(task);
Logcatで、それが再起動された後しかし、後
を実行しているPeriodicTask
ストップは、コードの関連するビットです私は次のようになる:
E/NetworkScheduler.TED: Couldn't start service: Intent
{ act=com.google.android.gms.gcm.ACTION_TASK_READY
cmp=xxx.xxxxxx.xxx/.tracking.MyTaskService (has extras)
}
追加は、すべての関連する詳細情報:
のAndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.google.example.gcmnetworkmanagerquickstart">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
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>
<!-- [START manifest_service] -->
<service
android:name=".MyTaskService"
android:exported="true"
android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
<intent-filter>
<action android:name="com.google.android.gms.gcm.ACTION_TASK_READY" />
</intent-filter>
</service>
<!-- [END manifest_service] -->
</application>
</manifest>
MainActivity
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final int RC_PLAY_SERVICES = 123;
public static final String TASK_TAG_PERIODIC = "periodic_task";
private GcmNetworkManager mGcmNetworkManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mGcmNetworkManager = GcmNetworkManager.getInstance(this);
if(checkPlayServicesAvailable()){
startPeriodicTask();
}
}
public void startPeriodicTask() {
Log.d(TAG, "startPeriodicTask");
PeriodicTask task = new PeriodicTask.Builder()
.setService(MyTaskService.class)
.setTag(TASK_TAG_PERIODIC)
.setPeriod(5)
.setPersisted(true)
.build();
mGcmNetworkManager.schedule(task);
}
private boolean checkPlayServicesAvailable() {
GoogleApiAvailability availability = GoogleApiAvailability.getInstance();
int resultCode = availability.isGooglePlayServicesAvailable(this);
if (resultCode != ConnectionResult.SUCCESS) {
if (availability.isUserResolvableError(resultCode)) {
// Show dialog to resolve the error.
availability.getErrorDialog(this, resultCode, RC_PLAY_SERVICES).show();
} else {
// Unresolvable error
Toast.makeText(this, "Google Play Services error", Toast.LENGTH_SHORT).show();
}
Log.d(TAG, "Play Services NOT Available");
return false;
} else {
Log.d(TAG, "Play Services Available");
return true;
}
}
}
MyTaskService
public class MyTaskService extends GcmTaskService {
private static final String TAG = "MyTaskService";
@Override
public void onInitializeTasks() {
}
@Override
public int onRunTask(TaskParams taskParams) {
Log.d(TAG, "onRunTask: " + taskParams.getTag());
return doPeriodicTask();
}
private int doPeriodicTask() {
Log.d(TAG, "doPeriodicTask Called");
return GcmNetworkManager.RESULT_SUCCESS;
}
}
build.gradle(アプリケーションモジュール)
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "26.0.0"
defaultConfig {
applicationId "com.google.example.gcmnetworkmanagerquickstart"
minSdkVersion 14
targetSdkVersion 26
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
allprojects {
repositories {
jcenter()
google()
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
implementation 'com.android.support:appcompat-v7:26.0.0-beta2'
compile 'com.squareup.okhttp:okhttp:2.7.0'
compile 'com.google.android.gms:play-services-gcm:11.0.2'
}
EDIT1:分析の数日後、私は次のことを考え出した:
- これは、デバイス固有の問題です。たとえば、ネクサスデバイスでは発生しません。
- これは大きな問題の一部です。この動作を示すデバイスも、
AlarmManager
,FirebaseJobScheduler
、RECEIVE_BOOT_COMPLETED broadcast receiver
と期待どおりに動作しません。 - 回避策の1つはthis solutionです。ただし、このソリューションには少なくとも2つの問題があります。 (1)アプリを終了すると、
AccessibilityService
の権限がリセットされます。つまり、この後にアプリを開くたびに、手動による許可が与えられます。 (2)アプリが殺された場合、再起動するとそれ以降は再起動されません。RECEIVE_BOOT_COMPLETED broadcast receiver
- 奇妙な発見:1つのデバイスで、パッケージ構造に
test
という単語があるとすべて動作します! - アプリケーションを設定>アプリケーション(この場所と名前はデバイスによって異なる可能性があります)にホワイトリストすると、すべて正常に動作します。
- アプリを手動で追加する必要がある起動アプリには、WhatsApp、Facebook、Instagramなどのよく知られているアプリが含まれています。これらのアプリをインストールすると、自動的にこのリストに追加されます。私はこれを行うためにこれらのメーカーのいずれかによって発行されたカスタムAPIをまだ見ていません。これは、私がこれらのアプリがメーカー側からホワイトリストに載っていると思うようにする。
Googleの独自のYoutube for Kidsアプリも同じ問題を抱えているという事実に気づいた。** E/NetworkScheduler.TED:サービスを開始できませんでした:Intent {act = com.google.android。 gms.gcm.ACTION_TASK_READY cmp = com.google.android.apps.youtube.kids/com.google.android.libraries.youtube.common.gcore.gcoreclient.gcm.impl.GcmTaskServiceDelegator(追加情報あり)} ** – ranjjose
複数のデバイスで発生しますか? – user2450263
はい、複数のデバイスで発生します。私はこれを1つのプラスのMIデバイスで経験しました。 – ranjjose