11

पर पृष्ठभूमि में काम नहीं करता है यह मेरा Activity कोड है,अलार्म प्रबंधक Android 6.0

Long time = new GregorianCalendar().getTimeInMillis()+20000;//Setting alarm after 20 sec 
Intent intentAlarm = new Intent("alarm"); 
intentAlarm.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
intentAlarm.putExtra("req_code",10); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,10, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent); 

ये सभी अनुमतियों को मैं अपने अनुप्रयोग में होती है,

<uses-permission android:name="android.permission.VIBRATE" /> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/> 
    <uses-permission android:name="com.myapp.pack.permission.SET_ALARM"/> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

यह मेरा BroadcastReceiver कोड है ,

@Override 
public void onReceive(Context context, Intent intent) { 
     SharedPreferences sharedPreferences = 
     context.getSharedPreferences("mydata", Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putBoolean("elligible",true); 
     editor.apply(); 

    } 

मैं पंजीकृत किया है मेरी प्रकट में BroadcastReceiver,

<receiver android:name="com.myapp.pack.AlarmReciever" android:enabled="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <action android:name="alarm" /> 
     </intent-filter> 
    </receiver> 

ऊपर कोड सफलतापूर्वक पृष्ठभूमि में पूर्व Marshmallow उपकरणों पर BroadcastReceiver निष्पादित करता है, लेकिन एक Marshmallow डिवाइस पर, BroadcastReceiver निष्पादित नहीं होती है। क्या किसी को पता है कि यहां क्या हो रहा है? धन्यवाद।

उत्तर

22

वहाँ (चाहे की बातें आप कोशिश कर सकते हैं, जो जब संगीत कार्यक्रम में इस्तेमाल किया, निष्क्रिय/अतिरिक्त/Doze मोड के सभी के माध्यम से कटौती करने के लिए सक्षम होना चाहिए के एक जोड़े हैं ओएस संस्करण)।

1. सामान्य BroadcastReceiver के बजाय WakefulBroadcastReceiver का उपयोग करें। सुनिश्चित करें कि आप WAKE_LOCK को सही तरीके से उपयोग करने की अनुमति शामिल हैं।

2. रिसीवर के लिए Intent शेड्यूल करने के लिए (एपीआई 23 से ऊपर & पर) setExactAndAllowWhileIdle() विधि का उपयोग करें:

if(Build.VERSION.SDK_INT < 23){ 
    if(Build.VERSION.SDK_INT >= 19){ 
     setExact(...); 
    } 
    else{ 
     set(...); 
    } 
} 
else{ 
    setExactAndAllowWhileIdle(...); 
} 

संदर्भ:

1.Alarm manager for background services

2.A flowchart for background work, alarms, and your Android app

+1

तो अगर मैं 'setExactAndAllowWhileIdle()' का उपयोग करता हूं तो क्या मुझे अपने ऐप के न्यूनतम एसडीके संस्करण को 23 में बदलना होगा? –

+0

धन्यवाद आदमी! आप रॉक :) –

+1

'setExact()' केवल एपीआई 1 9 से उपलब्ध है। इसलिए आपको स्निपेट में स्थिति में अगर भी चेक में ऐसा करने की ज़रूरत है। – Henry

6

कारण Doze mode एंड्रॉइड 6.0 मार्शमलो में पेश किया जा सकता है। set() के बजाय setAlarmclock() का उपयोग करें। यह विशेष रूप से अलार्म घड़ियों के लिए डिज़ाइन किया गया है और डोज़ के माध्यम से कटौती करने में सक्षम हो सकता है। कुछ एडीबी आदेशों आप मैन्युअल रूप से Doze या एप्लिकेशन स्टैंडबाई मोड में एक फोन डाल करने के लिए उपयोग कर सकते हैं कर रहे हैं:

https://developer.android.com/preview/features/power-mgmt.html

है कि आपके एप्लिकेशन को जगाने के लिए सक्षम नहीं है, वहाँ निश्चित पद्धति setExactAndAllowWhileIdle() लिए बनाया गया है फोन को डोज से जगाओ चाहे कोई फर्क नहीं पड़ता। सबसे खराब स्थिति परिदृश्य, आप इस विधि के साथ अपने ऐप को जगा सकते हैं और अगले अलार्म को शेड्यूल करने के लिए जागरूकता का उपयोग कर सकते हैं।

संदर्भ: How to make Alarm Manager work when Android 6.0 in Doze mode?

+0

ठीक है, मैं इसे आज़मा दूंगा। –

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