रीबूट करने के बाद आवधिक कार्य नहीं चला रहा है यदि ऐप अग्रभूमि, पृष्ठभूमि या मारे गए में ऐप चल रहा है तो ऐप अपेक्षित व्यवहार दिखाता है।जीसीएमनेटवर्क प्रबंधक
AndroidManifest
में:
<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 config:
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
के साथ अपेक्षित काम नहीं करते हैं। - एक वर्कअराउंड this solution है। हालांकि, इस समाधान में कम से कम 2 मुद्दे हैं। (1) जब आप ऐप को मारते हैं,
AccessibilityService
अनुमति रीसेट हो जाती है। इसका मतलब है कि हर बार जब आप ऐप खोलेंगे, मैन्युअल रूप से अनुमति दी जानी चाहिए। (2) यदि ऐप मारे गए हैं, तो इसके बाद रीबूटRECEIVE_BOOT_COMPLETED broadcast receiver
- पागल खोज: एक प्लस डिवाइस में, यदि आपके ऐप में पैकेज संरचना में
test
शब्द है, तो सबकुछ काम करता है !! - यदि आप सेटिंग में जा रहे एप्लिकेशन को श्वेतसूची में डालते हैं> ऐप्स (इसका स्थान और नाम अलग-अलग उपकरणों में अलग हो सकता है), सब कुछ अपेक्षित काम करता है।
- स्टार्ट अप ऐप्स जिनके लिए आपको अपने ऐप को मैन्युअल रूप से जोड़ना है, वे व्हाट्सएप, फेसबुक, इंस्टाग्राम और कई अन्य लोगों जैसे प्रसिद्ध ऐप्स हैं। जब आप इन ऐप्स को इंस्टॉल करते हैं, तो वे स्वचालित रूप से इस सूची में जोड़े जाते हैं! मुझे ऐसा करने के लिए इन निर्माताओं में से किसी एक द्वारा प्रकाशित एक कस्टम एपीआई अभी तक देखने के लिए नहीं है। इससे मुझे लगता है कि ये ऐप्स निर्माता के अंत से सफेद सूचीबद्ध हैं।
लॉग इन करते समय मैंने इस तथ्य पर ठोकर खाई कि Google के अपने यूट्यूब फॉर किड्स ऐप में भी एक ही समस्या है: ** ई/नेटवर्कशेड्यूलर। टेड: सेवा शुरू नहीं कर सका: इरादा {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
हां .. यह कई उपकरणों पर होता है। मैंने इसे एक प्लस, एमआई उपकरणों पर अनुभव किया है। – ranjjose