13

रीबूट करने के बाद आवधिक कार्य नहीं चला रहा है यदि ऐप अग्रभूमि, पृष्ठभूमि या मारे गए में ऐप चल रहा है तो ऐप अपेक्षित व्यवहार दिखाता है।जीसीएमनेटवर्क प्रबंधक

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: विश्लेषण के कुछ दिनों के बाद, मैं पता लगा है निम्नलिखित:

  1. यह एक उपकरण विशिष्ट मुद्दा है। उदाहरण के लिए, नेक्सस उपकरणों पर नहीं होता है।
  2. यह एक बड़ा मुद्दा का हिस्सा है। इस व्यवहार को दिखाने वाले डिवाइस AlarmManager, FirebaseJobScheduler और RECEIVE_BOOT_COMPLETED broadcast receiver के साथ अपेक्षित काम नहीं करते हैं।
  3. एक वर्कअराउंड this solution है। हालांकि, इस समाधान में कम से कम 2 मुद्दे हैं। (1) जब आप ऐप को मारते हैं, AccessibilityService अनुमति रीसेट हो जाती है। इसका मतलब है कि हर बार जब आप ऐप खोलेंगे, मैन्युअल रूप से अनुमति दी जानी चाहिए। (2) यदि ऐप मारे गए हैं, तो इसके बाद रीबूट RECEIVE_BOOT_COMPLETED broadcast receiver
  4. पागल खोज: एक प्लस डिवाइस में, यदि आपके ऐप में पैकेज संरचना में test शब्द है, तो सबकुछ काम करता है !!
  5. यदि आप सेटिंग में जा रहे एप्लिकेशन को श्वेतसूची में डालते हैं> ऐप्स (इसका स्थान और नाम अलग-अलग उपकरणों में अलग हो सकता है), सब कुछ अपेक्षित काम करता है।
  6. स्टार्ट अप ऐप्स जिनके लिए आपको अपने ऐप को मैन्युअल रूप से जोड़ना है, वे व्हाट्सएप, फेसबुक, इंस्टाग्राम और कई अन्य लोगों जैसे प्रसिद्ध ऐप्स हैं। जब आप इन ऐप्स को इंस्टॉल करते हैं, तो वे स्वचालित रूप से इस सूची में जोड़े जाते हैं! मुझे ऐसा करने के लिए इन निर्माताओं में से किसी एक द्वारा प्रकाशित एक कस्टम एपीआई अभी तक देखने के लिए नहीं है। इससे मुझे लगता है कि ये ऐप्स निर्माता के अंत से सफेद सूचीबद्ध हैं।
+0

लॉग इन करते समय मैंने इस तथ्य पर ठोकर खाई कि 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

+1

क्या यह करता है कई उपकरणों पर होता है? – user2450263

+0

हां .. यह कई उपकरणों पर होता है। मैंने इसे एक प्लस, एमआई उपकरणों पर अनुभव किया है। – ranjjose

उत्तर

0

PeriodicTask config:

PeriodicTask task = new PeriodicTask.Builder() 
       .setService(MyTaskService.class) 
       .setTag(TASK_TAG_PERIODIC) 
       .setPeriod(30L) 
       .setFlex(10L) 
       .setExtras(bundle) **/* you put this line here */** 
       .setPersisted(true) 
       .build(); 


    PeriodicTask task = new PeriodicTask.Builder() 
        .setService(MyTaskService.class) 
        .setTag(TASK_TAG_PERIODIC) 
/* you don't have ".setExtras(bundle)" line here */ 
/* try adding this line from above, as logcat is showing this */ 
        .setPeriod(5) 
        .setPersisted(true) 
        .build(); 
+0

इसे नोट करने के लिए धन्यवाद। हालांकि, यह मुद्दा नहीं है। मुझे लगता है जब मैंने चिपकाया कॉपी किया, मैंने गलत फाइल की प्रतिलिपि बनाई। समस्या डिवाइस विशिष्ट है। उदाहरण के लिए, वनप्लस और एमआई उपकरणों में, ये समस्याएं होती हैं। यह भी असंगत है। असल में एक प्लस (3 टी) में यदि आपके पास boot_completed पैकेज में "test" शब्द है हिट !! एमआई में कुछ भी काम नहीं करता है। समय के लिए, मुझे यहां बताया गया है कि एक्सेसस्टाइल सेवाओं के साथ एक काम मिल गया है जैसा कि यहां बताया गया है https://stackoverflow.com/a/41627296/1349159 – ranjjose

+1

हां यह डिवाइस के बहुत विशिष्ट मामले हैं। कई निर्माता एंड्रॉइड का स्वाद बनाते हैं और वहां अपनी सुरक्षा परत होती है जो ऐप बैक ग्राउंड सर्विस को तब तक शुरू करने के लिए रोकती है जब तक उपयोगकर्ता नहीं जाता और विशेष अनुमति देता है। हमने इस विकास को हमारे विकास में शीओमी मोबाइल में दोहराया है। उस स्थिति में आपको उपयोगकर्ता को कुछ प्रकार का सहायता दस्तावेज़ देना होगा। – Devesh

2

अद्यतन: मिले एक Won't Fix (Infeasible) bug उस विषय से संबंधित हो सकता है। ऐसा लगता है कि एक्सेसिबिलिटी सेवा व्यवहार डिवाइस पर संगत नहीं है। कुछ सेवा अक्षम कर देंगे, कुछ फिर से शुरू होंगे, आदि। यह ऑनलाइन पाए गए उपयोगकर्ता शिकायतों के साथ फिट बैठता है, और आपके अवलोकनों के साथ भी।

सबसे अच्छी सलाह है कि मैं एक अलग प्रक्रिया पर जितना संभव हो सके सेवा कर सकता हूं (इसलिए ऐप के साथ इसे मार नहीं दिया जाएगा), और बूट सक्षम होने पर भी यह सक्षम है, और यदि नहीं - आसान सक्षमता के लिए एंड्रॉइड एक्सेसिबिलिटी सेटिंग्स स्क्रीन तक त्वरित पहुंच की अनुमति देने के लिए अधिसूचना प्रणाली का उपयोग करें।


मैं विशिष्ट समस्या से परिचित नहीं हूं, लेकिन मेरा मानना ​​है कि यह कामकाज आपके लिए काम करेगा। मैं उत्पादन में अलार्ममेनगर के लिए इस कोड का उपयोग करता हूं।

AndroidManifest.xml में:

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

    <receiver android:name=".BootListener"> 
     <intent-filter> 
      <category android:name="android.intent.category.DEFAULT"/> 

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

और एक वर्ग बनाने

public class BootListener extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // If your bootstrap is in Application class, then it will be called anyway - nothing to do here. 
     // else - call your bootsrap here 
    } 
} 

मुझे विश्वास है कि

(2) एप्लिकेशन को मार डाला है, तो रिबूट कि जीत के बाद ' टी हिट करें RECEIVE_BOOT_COMPLETED प्रसारण रिसीवर

गलत है, रिबूट करते समय, एंड्रॉइड को कोई जानकारी नहीं है कि आपका ऐप मारा गया था। यह मेरे ऐप (+ 1.2 एम उपयोगकर्ताओं) के लिए कभी भी एक समस्या नहीं थी।

+0

धन्यवाद औवाल। मैंने पहले ही 'android.intent.category.DEFAULT' फ़िल्टर के साथ प्रयास किया था। दुर्भाग्यवश यह ' टी तीन से चार परीक्षण उपकरणों (एक प्लस 3 टी, एमआई, रेड्मी) पर काम करता था। ऐप को मारने के बाद रीबूट 'एक्सेसिबिलिटी सर्विस' – ranjjose

+0

के संबंध में है, मैंने आपके द्वारा पोस्ट किए गए कोड में ब्रॉडकास्ट रिसीवर नहीं देखा है। – auval

+0

जो भी मैं 'अभिगम्यता सेवा' के बारे में पढ़ता हूं वह यह है कि जब आप ऐप को मारते हैं, तो यह एक्सेसिबिलिटी सेवा अनुमति – ranjjose

संबंधित मुद्दे