AlarmManager ไม่ทำงานในอุปกรณ์หลายเครื่อง


85

แอพของฉันใช้ AlarmManager และใช้งานได้ตั้งแต่ 4 ปีที่แล้ว แต่ฉันสังเกตเห็นว่าอุปกรณ์บางอย่างเริ่มทำงานล้มเหลว

ฉันค่อนข้างแน่ใจว่ารหัสถูกต้อง (ฉันใช้ WakefulBroadcastReceiver และ setExactAndAllowWhileIdle สำหรับอุปกรณ์ที่มี Doze) เนื่องจากทำงานได้อย่างสมบูรณ์บนอุปกรณ์ Nexus แต่ล้มเหลวในอุปกรณ์ของผู้ผลิตบางราย (Huawei, Xiaomi ... )

ตัวอย่างเช่นอุปกรณ์ Huawei มีตัวจัดการแบตเตอรี่ชนิดหนึ่งที่ฆ่าแอปและเมื่อแอปถูกฆ่าการเตือนตามกำหนดเวลาจะถูกยกเลิก ดังนั้นการตั้งค่าแอปเป็น "ป้องกัน" ในตัวจัดการแบตเตอรี่ของ Huawei ช่วยแก้ปัญหาได้

แต่เมื่อไม่นานมานี้ฉันสังเกตเห็นว่ามันใช้ไม่ได้กับอุปกรณ์อื่น ๆ : Xiaomi, Samsung (อาจเกี่ยวข้องกับ "Smart Manager" ใหม่?) ... ดูเหมือนว่าพฤติกรรมนี้จะกลายเป็นมาตรฐาน: เพื่อฆ่าแอปพื้นหลัง

ใครรู้อะไรเกี่ยวกับเรื่องนี้ วิธีใดเพื่อให้แน่ใจว่าสัญญาณเตือนถูกลั่น?

แก้ไข: ปัญหานี้เกิดจาก "ตัวประหยัดแบตเตอรี่" ที่เพิ่มโดยผู้ผลิตที่แตกต่างกัน ข้อมูลเพิ่มเติมที่นี่: https://dontkillmyapp.com/


8
ผู้ผลิตตำหนิแอปเรื่องการใช้พลังงานและพวกเขาทำการตลาด Octa-cores ซึ่งกินแบตเตอรี่มากกว่าเมื่อเทียบกับ CPU ที่มีคอร์น้อยกว่า พวกเขาคิดว่าการเพิ่มแกนหลักจะทำให้โทรศัพท์ของพวกเขาเร็วขึ้นหรือไม่?
FrozenFire

1
@AviLevinshtein บางทีฉันอาจจะเข้าใจคำถามของคุณผิด ฉันกำลังสร้างการปลุกในกิจกรรมของฉัน จากนั้นเมื่อสัญญาณเตือนดังขึ้นเครื่องรับสัญญาณจะถูกเรียกใช้งานและในที่สุด WakefulIntentService (คลาสจาก @commonsware) จะถูกเรียกใช้งาน
Sergio Viudes

2
@JFValdes ฉันยังคงมองหาวิธีแก้ปัญหา AlarmManager ทำงานได้อย่างสมบูรณ์แบบบนอุปกรณ์ที่มี Vanilla Android ปัญหาคือผู้ผลิตพยายาม "ปรับปรุง" คุณสมบัติของ Android และพวกเขาทำลาย AlarmManager ... ผู้ผลิตไม่ควรใช้ "แบตเตอรี่ประหยัด" ของตัวเองหากใช้โหมด Doze มาตรฐาน AlarmManager จะทำงานได้อย่างสมบูรณ์ ... ยังคงมองหา สำหรับวิธีแก้ไข ...
Sergio Viudes

1
มีวิธีแก้ไขหรือยัง แอพอื่น ๆ เช่นการช่วยเตือนหรืออะไรทำอย่างนั้น? ต้องมีตัวเลือกอื่นที่ไม่ใช่ setAlarm ซึ่งมีไว้สำหรับการเตือนไม่ใช่สำหรับการเตือน
kv1dr

1
@SergioViudes ฉันกำลังประสบปัญหาเดียวกันกับอุปกรณ์ Xiomi สำหรับการติดตาม และหากฉันหลีกเลี่ยงข้อ จำกัด ในการประหยัดแบตเตอรี่มากกว่าแอปที่ทำงานได้อย่างถูกต้องในอุปกรณ์ 3 ใน 4 เครื่องโดยทำตามการตั้งค่าต่อไปนี้ - -> ไปที่แบตเตอรี่ -> พลังงาน -> โปรแกรมประหยัดแบตเตอรี่ของแอป -> แอปของคุณตอนนี้เลือก ไม่มีข้อ จำกัด (สำหรับการตั้งค่าพื้นหลัง) จากนั้นอนุญาตตัวเลือกสำหรับตำแหน่งพื้นหลัง
Imran Khan Saifi

คำตอบ:


17

ฉันพยายามแก้ปัญหานี้มาหลายสัปดาห์แล้ว ฉันไม่พบอะไรเลย หัวเว่ยเพียงแค่ฆ่าสัญญาณเตือนทั้งหมดหลังจากเวลาผ่านไป หากฉันใส่แอปลงในแอปที่ได้รับการป้องกันในโหมดประหยัดแบตเตอรี่ก็ไม่ช่วยอะไร แต่ถ้าฉันเปลี่ยนชื่อแพ็กเกจของแอปให้มีคำเช่นนาฬิกาปลุกนาฬิกาหรือปฏิทินมันจะทำงานได้ปกติเหมือนบนอุปกรณ์อื่น ๆ ฉันไม่เข้าใจว่า Google สามารถให้การรับรองเรื่องอึนี้ได้อย่างไร ฉันคิดว่า OEM ไม่ควรปรับเปลี่ยนแพลตฟอร์มหลักด้วยวิธีดังกล่าว ฉันเข้าใจว่าพวกเขามีโปรแกรมประหยัดแป้งของตัวเองซึ่งจะฆ่าแอปหลังจากเวลาผ่านไประยะหนึ่งเมื่อผู้ใช้ไม่ได้ใช้งาน แต่สัญญาณเตือนการฆ่านี้ยังมาจากแอปที่ได้รับการป้องกัน

ยัง setAlarmClock () สำหรับการเตือนเวลาที่แน่นอนช่วย แต่มันเป็นไปไม่ได้ที่จะใช้สิ่งนี้สำหรับการอัพเดทคิดเหมือนวิดเจ็ต

อัปเดต: การป้องกันโดยใช้คำหลักชื่อแพ็กเกจไม่ทำงานบนอุปกรณ์ Huawei ปัจจุบันซึ่งเป็นจริงในปี 2560


เช่นเดียวกับฉันฉันลองใช้แล้ว แต่ไม่มีวิธีใดที่จะแก้ปัญหานี้ในบางยี่ห้อ Xiaomi, Oppo, Huawei บางครั้งพวกเขาฆ่ากระบวนการพื้นหลังและสัญญาณเตือนเพื่อประหยัดแบตเตอรี่
Andi Susilo

1
ฉันมีโทรศัพท์ huawei การเปลี่ยนชื่อแพ็คเกจเป็นนาฬิกาปลุก / ปฏิทินไม่ได้ทำอะไรเลย วิธีเดียวที่จะหลีกเลี่ยงสิ่งนี้เพิ่มแอปของคุณในรายการแอปที่มีการป้องกันจากผู้จัดการโทรศัพท์
Ashish Pardhiye

9

ปัญหาคือ Smart Manager Samsung มีตัวจัดการแบตเตอรี่ซึ่งบางครั้งจะปิดใช้งานแอพบางตัวไม่ให้ทำงานในพื้นหลัง มันพยายาม "กลับมาทำงาน" เมื่อกลับไปที่แอพ แต่ปิดการใช้งานแอพพลิเคชั่นโดยสมบูรณ์หรืออาจกลับมาทำงานต่อทุกๆ 5 นาทีหรือมากกว่านั้น (ขึ้นอยู่กับว่า Samsung มีแอพอย่างไร)

สิ่งนี้ใช้ได้กับ Android เวอร์ชันสต็อกเนื่องจากไม่มี Samsung Manager คุณยังสามารถติดตั้ง Android เวอร์ชันที่กำหนดเองซึ่งมีคุณสมบัติบางอย่างเพื่อเปิดใช้งาน SM (ขึ้นอยู่กับรอม)


ฉันเริ่มคลั่งไคล้เพราะฉันไม่มีอุปกรณ์ Samsung ให้ทดสอบ ฉันรู้แค่ว่าผู้ใช้แอปของฉันบอกอะไรฉัน คุณรู้หรือไม่ว่าปัญหาคือ AlarmManager ไม่ทำงานเนื่องจากแอปถูกฆ่า? หรือปัญหาคืออุปกรณ์ไม่สามารถปลุกเมื่อนาฬิกาปลุกดับลงเพราะผู้จัดการคนนั้น?
Sergio Viudes

@SergioViudes เมื่อเร็ว ๆ นี้ บริษัท หลายแห่งได้ดำเนินการของตนเอง เช่น LG มีรุ่นไหนที่ใช้งานได้คล้ายกับ samsung โทรศัพท์ของคุณอาจมี? ปัญหาไม่ใช่การเตือนแอปการเตือนจะถูกผลักไปที่สถานะที่ไม่มีการใช้งานอย่างสมบูรณ์ Smart Manager คิดว่าเป็นเพียงแอปสุ่มที่คุณไม่ต้องการ ฉันสังเกตเห็นว่าแอพบางตัวสามารถผ่านมันไปได้บางทีแอพบางตัวอาจได้รับการยอมรับจากผู้จัดการอัจฉริยะ
SA

1
@SergioViudes ฉันมี samsung ให้ทดสอบและบอกได้เลยว่าคุณจะได้อะไรจากมันไม่มาก เมื่อผู้จัดการอัจฉริยะเพิ่มประสิทธิภาพแอปของคุณแล้วไม่มีข้อผิดพลาดหรืออะไรเลยมันก็ตายคล้ายกับการบังคับให้หยุด มันยังคงอยู่ในรายการแอพล่าสุดแม้ว่า
Tim

ขอบคุณทิม จะเป็นการดีที่จะแก้ปัญหานี้โดยไม่ต้องยกเว้นแอปจาก "Smart" Manager
Sergio Viudes

อุปกรณ์เช่น xiaomi (miui), vivo และ htc ตั้งค่าการอนุญาตทั้งหมดเป็นเท็จตามค่าเริ่มต้นเว้นแต่ว่าจะเป็นแอปในรายการแอป "ที่เชื่อถือได้" ซึ่งดูเหมือนจะเป็นตัวกำหนดเอง (whatsapp, truecaller ฯลฯ ได้รับความเชื่อถือโดยค่าเริ่มต้น ). นี่กำลังกลายเป็นฝันร้ายของ coders
desidigitalnomad

4

อุปกรณ์ Android ที่ทันสมัยส่วนใหญ่มาพร้อมกับแอปหรือกลไกซึ่งจะพยายามหาวิธีประหยัดแบตเตอรี่โดยอัตโนมัติและอาจทำให้แอปของบุคคลที่สามบางตัวเสียไป ซึ่งอาจส่งผลให้ลบงานและงานที่กำหนดเวลาไว้ (เช่นสัญญาณเตือนไม่ดับ, การแจ้งเตือนแบบพุชไม่ทำงาน ฯลฯ ) ในหลาย ๆ กรณีสิ่งนี้เกิดขึ้นโดยไม่ขึ้นกับกลไกการประหยัดแบตเตอรี่ของ Android ในกรณีของฉันฉันไม่สามารถเพิ่มประสิทธิภาพแบตเตอรี่ได้มากขึ้นเมื่อฉันตรวจพบอุปกรณ์บางรุ่นฉันเปลี่ยนเส้นทางผู้ใช้ไปยังตัวจัดการการเริ่มต้นระบบเพื่ออนุญาตแอปพลิเคชันของฉัน

คุณพบในลิงค์นี้สำหรับทุกรุ่นเจตนาที่คุณควรเรียกใช้ https://android-arsenal.com/details/1/6771


2

ฉันยังมีแอพที่ตั้งค่าการเตือนวิธีแก้ปัญหาคือใช้AlarmManager.setAlarmClock ()บน api> = 21 สิ่งนี้ไม่ได้รับผลกระทบจาก doze afaik และมีโบนัสเพิ่มเติมในการวางไอคอนนาฬิกาปลุกในถาดระบบ


ขอบคุณสำหรับคำตอบ. มีวิธีใดในการลบไอคอนนาฬิกาปลุกหรือไม่?
Sergio Viudes

ขออภัย setAlarmClock ไม่ทำงานในบางครั้ง ฉันทดสอบบนอุปกรณ์ Oreo ที่มีหน่วยความจำเหลือน้อย
Boris Salimov

มีใครพบวิธีแก้ปัญหานี้ไม่ทำงานบนอุปกรณ์ huawei บ้าง?
ЄвгенГарастович

ลองใช้ WorkManager แทน
Tyler Pfaff

2

ใช้ AlarmManager สำหรับอุปกรณ์ <5.0 และ JobScheduler สำหรับอุปกรณ์ 5.0 ขึ้นไป ฉันไม่สามารถพูดได้อย่างแน่นอนว่า JobScheduler จะไม่ได้รับผลกระทบจากผู้ผลิตเชนานิแกน แต่ดูเหมือนว่าฉันจะมีโอกาสน้อยกว่ามากเนื่องจาก Android พยายามย้ายผู้คนออกจาก AlarmManager และเข้าสู่ JobScheduler

แก้ไข: Google มีออกมาพร้อมกับวิธีการแก้ปัญหาของบุคคลที่จะแก้ไขปัญหานี้เรียกว่าWorkManager มันทำให้กรอบการจัดกำหนดการหลาย ๆ กรอบเป็นนามธรรมและใช้กรอบที่เหมาะสมที่สุดสำหรับอุปกรณ์


2
น่าเสียดายที่ไม่เหมือนกับคลาส AlarmManager เวลาไม่แน่นอนเมื่อใช้ JobScheduler ในแอปของฉันเวลาควรจะแน่นอน :(
Sergio Viudes

ฉันลองใช้แล้วเครื่องมือเพิ่มประสิทธิภาพบางอย่าง (อย่างน้อยก็ซัมซุง) ฆ่างานที่ค้างอยู่ทั้งหมดใน JobScheduler เมื่อหน้าจอดับลง ก็เลยแตกด้วย สิ่งนี้เกิดขึ้นใน 5.0 หลังจากอัปเดตเป็น 6.0 มันใช้งานได้ดีฉันเดาว่าพวกเขาคงแก้ไขแล้ว ฉันยังทดสอบกับผู้ผลิตรายอื่นไม่ได้
Sloy

สำหรับเวลาที่แน่นอนคุณไม่สามารถใช้บริการพื้นหลังหรือบริการตามกำหนดเวลาได้ คุณอาจลองใช้บริการเบื้องหน้า แต่จะสร้างการแจ้งเตือนต่อเนื่องสำหรับผู้ใช้ (อาจไม่เป็นที่พึงปรารถนา) และโทรศัพท์บางรุ่นมีตัวฆ่างานในตัวซึ่งจะทำลายบริการเบื้องหน้าโดยอัตโนมัติ WorkManager เป็นทางออกที่ดีที่สุด แต่น่าเสียดายที่จะไม่ให้เวลาที่แน่นอน
ทอม

1

อาจจะสายไป แต่ฉันหวังว่ามันจะช่วยใครสักคนได้

ฉันติดอยู่กับปัญหาเดิม ๆ มานานมาก แต่ตอนนี้ฉันรู้วิธีแก้ปัญหานี้ สำหรับทุกคนที่อาจมีปัญหาเดียวกัน ผู้คนมักบอกว่าคุณต้องเปิดใช้งานAutoStartแต่ฉันสามารถจัดการได้โดยไม่ต้องใช้การเริ่มอัตโนมัติ

ก่อนอื่น WakeFullBroadcastaReceiver เลิกใช้แล้วและคุณควรใช้ BroadcastReceiver ประการที่สองคุณต้องใช้ ForegroudService แทน BackgroundService

ฉันจะยกตัวอย่างดังต่อไปนี้:

IntentService.class

public class NotificationService extends IntentService {


//In order to send notification when the app is close
//we use a foreground service, background service doesn't do the work.



public NotificationService() {
    super("NotificationService");
}

@Override
public void onCreate() {
    super.onCreate();

}

@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);

    //There is no difference in the result between start_sticky or start_not_sticky at the moment
    return START_NOT_STICKY;
}

@Override
protected void onHandleIntent(@Nullable Intent intent) {

    //TODO check if the app is in foreground or not, we can use activity lifecyclecallbacks for this

    startForegroundServiceT();
    sendNotification(intent);
    stopSelf();
}


/***
 * you have to show the notification to the user when running foreground service
 * otherwise it will throw an exception
 */
private void startForegroundServiceT(){

    if (Build.VERSION.SDK_INT >= 26) {
        String CHANNEL_ID = "my_channel_01";
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
                "Channel human readable title",
                NotificationManager.IMPORTANCE_DEFAULT);

        ((NotificationManager) 
   getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);

        Notification notification = new Notification.Builder(this, CHANNEL_ID)
                .setContentTitle("")
                .setContentText("").build();

        startForeground(1, notification);
    }
}

private void sendNotification(Intent intent){

    //Send notification
    //Use notification channle for android O+
}
}

เริ่มบริการเบื้องหน้าในBroadcastReceiver.class

public class AlarmReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {


    Intent service = new Intent(context, NotificationService.class);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        context.startForegroundService(service);
    } else {
        context.startService(service);
    }

}
}

และ setAlarms เช่นนี้:

 public static void setAlarm(Context context, int requestCode, int hour, int minute){


    AlarmManager alarmManager =( AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context//same activity should be used when canceling the alarm
            , AlarmReceiver.class);
    intent.setAction("android.intent.action.NOTIFY");

    //setting FLAG_CANCEL_CURRENT makes some problems. and doest allow the cancelAlarm to work properly
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1001, intent, 0);

    Calendar time = getTime(hour, minute);

    //set Alarm for different API levels
    if (Build.VERSION.SDK_INT >= 23){
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,time.getTimeInMillis(),pendingIntent);
    }
    else{
        alarmManager.set(AlarmManager.RTC_WAKEUP,time.getTimeInMillis(),pendingIntent);
    }

จากนั้นคุณจะต้องประกาศผู้รับและบริการส่วนหน้าในรายการ

       <receiver android:name=".AlarmReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.NOTIFY">

            </action>
        </intent-filter>
    </receiver>
    <service
        android:name=".NotificationService"
        android:enabled="true"
        android:exported="true"></service>

ฉันหวังว่านี่จะช่วยได้บ้าง


แต่ไม่มีใครโหวตให้? @ keivan.k
gumuruh

มันใช้ไม่ได้ setExactAndAllowWhileIdleสามารถรอการตัดบัญชีได้เช่นกัน ฉันล่าช้าไปถึง 50 นาทีกับสิ่งนี้ ใช้setAlarmClockแทน อย่างไรก็ตามแม้สิ่งนี้จะเสียในอุปกรณ์ huawei และฉันก็
หมดตัว

0

โทรศัพท์รุ่นใหม่ส่วนใหญ่ในปัจจุบันมาพร้อมกับแบตเตอรี่ / ตัวจัดการการประหยัดพลังงานบางประเภทซึ่งทำสิ่งเดียวกับที่คุณอธิบายไว้ ไม่นับดูบูสเตอร์และมาสเตอร์คลีน

ฉันคิดว่าคุณต้องใส่ข้อจำกัดความรับผิดชอบหรือคำถามที่พบบ่อยในรายชื่อแอพ / Play Store ของคุณโดยระบุว่าแอพนี้จำเป็นต้องยกเว้นแอพตัวจัดการแบตเตอรี่เพื่อให้ทำงานได้อย่างถูกต้อง


ควรมีวิธีอื่นที่จะทำได้ ... ผู้ใช้จะไม่อ่านข้อจำกัดความรับผิดชอบ ฉันคิดไม่ถึงว่าโทรศัพท์ Samsung ไม่อนุญาตให้แอปใช้ AlarmManager ...
Sergio Viudes

สัญญาณเตือนจะไม่ยิง "ตรงเวลา" แต่ในที่สุดก็จะเริ่ม
Gavriel

นี่คือคำตอบที่เป็นประโยชน์ที่สุด (น่าเศร้า) ฉันจะพูด ฉันหวังว่าจะมีทางออกที่ดีกว่านี้ แต่ผู้ผลิตฮาร์ดแวร์กำลังทำลาย vanilla Android ที่ทำงานได้อย่างสมบูรณ์แบบ
caw

0

ฉันหยุดใช้ AlarmManager มาสักพักแล้ว ... ทางเลือกที่ดีและเสถียรกว่า

  1. สร้างบริการ
  2. ลงทะเบียน BroadcastReceiver สำหรับ BOOT_COMPLETED
  3. เริ่มบริการของคุณจากเครื่องรับ
  4. เริ่มตัวจัดการใหม่ในบริการของคุณที่วนซ้ำทุก X นาที ( Android - เรียกใช้วิธีการเป็นระยะโดยใช้ postDelayed () call )
  5. ตรวจสอบว่ามีเวลาในการดำเนินการหรือไม่: ตอนนี้ - เวลาดำเนินการ> 0 ( จะหาระยะเวลาของความแตกต่างระหว่างสองวันที่ใน java ได้อย่างไร )
  6. ถ้าเป็นเช่นนั้น .. สั่งงานและหยุดตัวจัดการ

ใช่.. มันเจ็บปวด.. แต่งานสำเร็จไม่ว่าอะไร


3
ขอบคุณสำหรับคำแนะนำของคุณ แต่ฉันต้องการหลีกเลี่ยงแนวทางดังกล่าวเนื่องจากการใช้ AlarmManager จะไม่ใช้ RAM หรือทรัพยากรใด ๆ และหากแอปของคุณถูกฆ่าบริการจะหยุดใช่ไหม?
Sergio Viudes

ฉันไม่ได้บอกว่าแนวทางนี้คือ BOOLETPROOF แต่อย่างน้อยก็ประกอบด้วยเวอร์ชัน API ที่แตกต่างกัน :)
ymz

2
เพื่อให้ทำงานได้อย่างน่าเชื่อถือโซลูชันนี้อาจต้องใช้ Wake Lock และจะกินแบตเตอรี่จำนวนมาก
Paweł Nadolski

ฉันเดาว่าคุณคิดถูกแล้ว .. คำถามเดียวคืออะไรจะแย่ที่สุด - โค้ดที่ไม่น่าเชื่อถือหรือประสิทธิภาพที่ไม่ดี? อย่างไรก็ตามโดยส่วนตัวแล้วฉันคิดว่ามีวิธีอื่นสำหรับการล็อคที่อาจเหมาะสมในบางกรณี (เช่นstackoverflow.com/questions/5346694/… )
ymz

แต่กลไกหลัก - ผู้รับสัญญาณ Broadcas - ไม่เรียกว่า \
Noor Hossain

0

คุณกำลังฟัง BOOT_COMPLETED หรือไม่ คุณต้องตั้งนาฬิกาปลุกอีกครั้งเมื่อรีบูตอุปกรณ์


ใช่. อย่างที่บอกว่าสัญญาณเตือนใช้งานได้ตั้งแต่ปี 2555 จนถึงปัจจุบัน เมื่อรีบูตอุปกรณ์ฉันจะตั้งเวลาการเตือนใหม่ในเครื่องรับสัญญาณออกอากาศ BOOT_COMPLETED
Sergio Viudes

1
การรีบูตแอปของคุณให้ทำงานอีกครั้งไม่ได้เป็นวิธีแก้ปัญหาเพียงครึ่ง
Tim

1
@TimCastelijns นั่นไม่ใช่สิ่งที่ฉันพูดเลย หากรีบูตอุปกรณ์จะต้องตั้งค่าการเตือนทั้งหมดที่ตั้งค่าด้วยตัวจัดการการเตือนอีกครั้ง
Tyler Pfaff

@TylerPfaff ใช่ แต่การรีสตาร์ทอุปกรณ์ไม่เกี่ยวข้องกับปัญหาในคำถามนี้
ทิม

0

อุปกรณ์เหล่านี้ใช้ Android เวอร์ชันใด

ตั้งแต่ API 23 ระบบปฏิบัติการจะเข้าสู่โหมดไม่ได้ใช้งานพลังงานต่ำเมื่อไม่มีการใช้งานสักระยะหนึ่งและในโหมดดังกล่าวจะไม่มีการแจ้งเตือน มีวิธีให้แอปพูดอย่างชัดเจนว่า "ฉันต้องการให้สัญญาณเตือนนี้ดังขึ้นในเวลานี้โดยไม่คำนึงถึงการใช้งานแบตเตอรี่" วิธีการใหม่ที่เรียกว่า AlarmManager และsetAndAllowWhileIdle()setExactAndAllowWhileIdle()

จากคำอธิบายของคุณดูเหมือนว่านี่อาจไม่ใช่สาเหตุเฉพาะของปัญหาของคุณในอุปกรณ์ของ OEM บางรุ่น แต่นี่เป็นสิ่งที่นักพัฒนาทุกคนที่ใช้ Alarm Manager ควรทราบ

สุดท้ายการใช้งานหลายอย่างของ Alarm Manager จะได้รับการแก้ไขที่ดีขึ้นโดยใช้กลไกของ Job Scheduler สำหรับความเข้ากันได้แบบย้อนหลัง Play Services "GCM Network Manager" นั้นใกล้เคียงกับ Job Scheduler มากในการทำงานโดยใช้ Job Scheduler เป็นการภายในใน Android เวอร์ชันใหม่กว่าและไม่จำเป็นต้องเกี่ยวกับระบบเครือข่ายแม้จะมีชื่อชั้นเรียนก็ตาม


อุปกรณ์ Samsung ที่มี Smart Manager ใช้งาน Lollipop ฉันใช้ setExactAndAllowWhileIdle สำหรับอุปกรณ์ Marshmallow อยู่แล้ว ฉันจะดู JobScheduler และ GCM อย่างไรก็ตามฉันไม่รู้ว่าปัญหาคือนาฬิกาปลุกจะไม่ดับหรือถ้าอุปกรณ์นั้นไม่ปลุกเมื่อนาฬิกาปลุกดับลง
Sergio Viudes

0

ฉันไม่คิดว่าการฆ่าแอปจะป้องกันไม่ให้ตัวจัดการการปลุกปลุกแอปของคุณ

เฉพาะเมื่อคุณ "บังคับหยุด" หรือปิดการใช้งานแอปคุณจะไม่ได้รับการโทรกลับจากตัวจัดการการเตือนภัย

สาเหตุอาจเป็นอย่างอื่น

นอกจากนี้ใน M ... setExactAndAllowWhileIdle ทำการควบคุมปริมาณ ... นั่นคือถ้าคุณตั้งเวลาปลุกทุกๆ 2 นาทีมันจะไม่ถูกทริกเกอร์ .. ต้องมีหน้าต่าง 15 นาที .


1
ขอบคุณสำหรับคำตอบ. แต่ถ้าไม่เป็นเช่นนั้นเหตุใดแอปจึงทำงานได้อย่างสมบูรณ์เมื่อปิดใช้งาน "การเพิ่มประสิทธิภาพแบตเตอรี่" ใน Smart Manager
Sergio Viudes

คุณกำลังเรียกใช้แอปบนอุปกรณ์ที่รูทอยู่หรือไม่หากใช่ตัวจัดการแอปสามารถปิดการใช้งานแอปได้ด้วย ..
rupesh jain

ไม่ฉันไม่ได้ใช้งานบนอุปกรณ์ที่รูท
Sergio Viudes

@rupeshjain "นั่นคือถ้าคุณตั้งเวลาปลุกทุก 2 นาทีมันจะไม่ถูกกระตุ้น ... ต้องมีหน้าต่าง 15 นาที" นี่ไม่เป็นความจริงอย่างสมบูรณ์มันเป็นปัญหาที่แท้จริงถ้ามันเป็นจริง คุณสามารถอ่านระยะเวลาที่ จำกัด สำหรับการตั้งเวลาภายใน Android Docs สำหรับเมธอด setExactAndAllowWhileIdle มีข้อ จำกัด เกี่ยวกับความถี่ในการส่งเสียงเตือนสำหรับแอปพลิเคชันเฉพาะ ภายใต้การทำงานของระบบปกติจะไม่ส่งสัญญาณเตือนเหล่านี้เกินทุกนาทีเมื่ออยู่ในโหมดไม่ได้ใช้งานพลังงานต่ำระยะเวลานี้อาจนานกว่านั้นอย่างมาก 15 นาที
eyadMhanna

0

สำหรับ Xiaomi คุณอาจต้องเปิดใช้งาน AutoStart สำหรับแอปของคุณ ฉันกำลังพยายามทำรายการการแก้ไขของ Android (โดยปกติจะมาจากผู้ผลิตโทรศัพท์) ที่อาจส่งผลต่อกระบวนการพื้นหลัง หากคุณมีสิ่งใหม่โปรดเพิ่มคำตอบที่นี่รายชื่อผู้สังหารงาน Android


0

เราจำเป็นต้องเปิดใช้งานแอปของเราในตัวจัดการการเริ่มอัตโนมัติในตัวจัดการแอปโทรศัพท์มือถือบางรุ่นเช่น vivo v5

ใน vivo v5 เราสามารถค้นหาเมนูนี้ได้ใน iManager -> App Manager -> Auto Start Manager เปิดใช้งานแอพของเราที่นี่

จากนั้นนาฬิกาปลุก / ตัวจัดการสัญญาณของคุณจะส่งเสียงเตือนหากแอปถูกฆ่าหรือปิด


0

ฉันกำลังมองหาคำตอบและหลังจากผ่านไปหลายชั่วโมงฉันก็พบสิ่งนี้:

https://stackoverflow.com/a/35220476/3174791

ในประวัติย่อเป็นวิธีที่จะทราบได้ว่าแอปของคุณถูกฆ่าโดย "แอปที่ได้รับการป้องกัน" หรือไม่และใช้ได้กับอุปกรณ์ Huawei เท่านั้น แจ้งให้เราทราบหากมีวิธีแก้ปัญหาสำหรับอุปกรณ์อื่น ๆ (Samsung, Sony, Xiaomi ฯลฯ )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.