2011-01-10 53 views
20

Tôi gặp sự cố với AlarmManager, tôi đặt mã để lập lịch báo thức lặp lại và sau khi chạy ứng dụng, báo thức sẽ hoạt động tốt. Ngay cả khi tôi nhấp vào nút Home (và ứng dụng bị tạm dừng), báo thức vẫn chạy trên khoảng thời gian của nó.Android báo động bị hủy sau khi đóng ứng dụng

Vấn đề là nếu tôi mở Trình quản lý tác vụ và buộc đóng ứng dụng, thì báo thức sẽ ngừng chạy.

Đây có phải là hành vi bình thường không, có cách nào để tránh điều này và giữ cho báo thức chạy sau khi đóng ứng dụng không?

Mã dưới đây - phương thức được gọi bởi lớp ApplicationContext, onCreate(). đang

private void scheduleAlarm() { 
    if (alarmScheduled == true) { return; } // we only need to schedule once. 

    int alarmInterval = Def.pref(getApplicationContext()).getInt("alarmInterval", 30); 

    final Intent intent = new Intent(getApplicationContext(), CollectorAlarmReceiver.class); 
    final PendingIntent pending = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0); 

    AlarmManager alarmMgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 

    alarmMgr.cancel(pending); // cancel others. 

    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+1000, 
    alarmInterval*1000, pending); 

    Def.log(TAG,"scheduleAlarm(): alarm scheduled, interval: "+alarmInterval+" seconds"); 
    alarmScheduled = true; 
} 

Receiver:

public void onReceive(Context context, Intent intent) { 
    Log.i(TAG, "CollectorAlarmReceiver invoked, starting CollectorService in background"); 

    context.startService(new Intent(context, CollectorService.class)); 

    Intent collectorService = new Intent(context,CollectorService.class); 
    collectorService.putExtra("action", CollectorService.ACTION_BACKGROUND_REQUEST_MESSAGES); 

    context.sendBroadcast(collectorService); 
} 

Cảm ơn!

+0

Bạn có thể đăng mã nhận và ví dụ về alarmInterval không? – ninjasense

+0

Tôi đã đăng mã cho Người nhận. AlarmInterval là 30 giây. Bạn có thể thấy rằng có một Đăng nhập trên onReceive, vì vậy tôi có thể theo dõi khi Người nhận được gọi. Và trong khi chạy ứng dụng, nó hoạt động tốt, vấn đề là khi nó được đóng lại. –

+0

Tại sao bạn không đặt đồng hồ báo thức trong đồng hồ mặc định của hệ thống. Sau đó, giết nó bằng trình quản lý tác vụ và xem nó có hoạt động như ứng dụng của bạn không. Nếu nó cũng không thể báo động bạn. Tôi nghĩ rằng nó là ok cho ứng dụng của bạn và bạn không cần phải làm bất cứ điều gì. –

Trả lời

6

Đây là hành vi bình thường. Nếu người dùng tự nguyện buộc dừng ứng dụng, thì nó sẽ bị dừng lại. Khác, bạn đang tạo ra một loại virus như ứng dụng.

Nếu bạn thực sự muốn, bạn có thể viết một dịch vụ khác theo dõi nếu dịch vụ khác của bạn đang chạy và chạy dịch vụ nếu dịch vụ không hoạt động. Nhưng đây sẽ là một ứng dụng khác và (bạn hy vọng) người dùng sẽ không giết ứng dụng này bằng cách sử dụng trình quản lý tác vụ.

Cá nhân, tôi sẽ không lo lắng. Nếu người dùng dừng nó, họ muốn dừng nó lại. Đừng làm phiền người dùng.

+18

Tôi không đồng ý vì có nhiều ứng dụng sẽ thực hiện điều này với ý định tốt như một đồng hồ báo thức đơn giản. Ngoài ra Android không có nghĩa là để có nhiệm vụ bị giết thông qua một kẻ giết người nhiệm vụ. – ninjasense

+0

Có, trong trường hợp của tôi, tôi muốn tái tạo hành vi của dịch vụ "ping" Foursquare, nơi bạn có thể nhận được thông báo ngay cả sau khi đóng ứng dụng Foursquare. Ứng dụng Facebook cũng vậy nhưng tôi nghĩ nó sử dụng C2DM. C2DM là cách duy nhất để làm điều đó mà không cần giữ một dịch vụ trong bộ nhớ? –

+0

Bạn có một điểm tuyệt vời. Nhưng điều gì xảy ra với những người sử dụng TaskKiller. Họ không biết rằng làm như vậy có nghĩa là các báo động sẽ không tắt. Tôi không muốn thực hiện một ứng dụng thứ hai theo dõi ứng dụng thực tế để đảm bảo báo thức được đặt. Bất kỳ ý tưởng? (Tôi biết nó là một bài cũ). – Andy

1

Buộc đóng ứng dụng của bạn không phải là cách chính xác để đóng ứng dụng và có thể cho bạn hành vi không chính xác.

Điều này question cũng có thể hữu ích.

0

Tôi đã có thể thực hiện chính xác những gì bạn cần. Ngay cả khi bạn dừng ứng dụng thông qua tab đang chạy trong công cụ quản lý ứng dụng, dịch vụ sẽ tự khởi động lại. Cách duy nhất để giết nó là thông qua nút dừng lực bên cạnh tùy chọn unistall trong trình quản lý ứng dụng. Về cơ bản bạn gọi Dịch vụ trực tiếp. Dưới đây là mã của tôi:

public class TestService extends Service { 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
     Toast.makeText(this, "Ejecutando Servicio ...", Toast.LENGTH_SHORT).show(); 
    return Service.START_NOT_STICKY;  
    } 

@Override 
    public void onCreate() { 
     super.onCreate(); 
     Toast.makeText(this, "Iniciando Servicio ...", Toast.LENGTH_SHORT).show(); 
} 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(this, "Deteniendo Servicio ...", Toast.LENGTH_SHORT).show(); 
} 

On hoạt động khách hàng viết đoạn mã sau:

  Calendar cal = Calendar.getInstance(); 
     Intent intent = new Intent(this,TestService.class); 
     PendingIntent pIntent = PendingIntent.getService(this.getApplicationContext(), 0, intent, 0); 
     alarm= (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarm.setRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), 3*1000, pIntent); 

Và tuyên bố dịch vụ trong biểu hiện:

 <service 
     android:name="TestService" 
     android:icon="@drawable/ic_launcher" 
     android:label="TestService" 
     > 
    </service>   
+0

Dịch vụ là cách để đi @Igor, tôi cần thêm trợ giúp với bạn về công cụ dịch vụ tạo đồng hồ báo thức, tôi đã sử dụng nhưng dường như không hoạt động tốt, u có thể giúp tôi và kiểm tra mã của tôi không? –

+0

Đây là link1 https://github.com/huxaiphaer/DiabeticsApp/blob/master/Droid/AlarmReceiver.cs link2. https://github.com/huxaiphaer/DiabeticsApp/blob/master/Droid/AppStickyService.cs –

+0

Có thể liên kết này có thể trợ giúp? http://www.truiton.com/2014/09/android-service-broadcastreceiver-example/ –

7

Tôi tin @GSree là sai. Có một cách đơn giản để đạt được điều này. Chỉ cần sử dụng một hành động tùy chỉnh. Đây là cách:

Đầu tiên, xác định một tên hành động tùy chỉnh, chẳng hạn như:

public static final String MY_ACTION = "com.sample.myaction" 

Sau đó tạo một BroadcastReceiver:

public class MyAlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(MY_ACTION)) { 
      // Do something here 
     } 
    }  
} 

Đăng ký nhận trên AndroidManifest của bạn.xml:

<receiver android:name="com.sample.MyAlarmReceiver"> 
    <intent-filter> 
     <action android:name="com.sample.myaction"/> 
    </intent-filter> 
</receiver> 

Sau đó, để thiết lập báo động, sử dụng PendingIntent sau:

Intent i = new Intent(MY_ACTION); 
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0); 

Có thể có những cách khác để làm điều đó, nhưng tôi đã cố gắng giải pháp này và BroadcastReceiver được gọi ngay cả khi tôi buộc thoát ứng dụng của tôi khỏi trình bao.

Lưu ý cách giải pháp này không yêu cầu bạn tạo dịch vụ.

+4

đã thử cách này, không hoạt động sau khi tôi buộc thoát ứng dụng của mình, tôi đang sử dụng Android 4.2.1. Nó chỉ hoạt động khi tôi chạm vào nút trang chủ (ứng dụng chỉ bị tạm dừng - không bị giết). Bất kỳ ý tưởng tại sao? –

+0

có ai tìm thấy vấn đề trên kitkat và nền tảng hệ điều hành không? giải pháp này không hoạt động có plz giúp – KOTIOS

+0

người đàn ông bất kỳ câu trả lời? –

1

Tôi đã thực hiện việc này một vài lần, nhưng tự hỏi tại sao ya sẽ chỉ định mã yêu cầu là 0; Tôi nghĩ rằng việc báo động của bạn một số duy nhất sẽ giúp ích rất nhiều.

1

Thêm

<receiver android:name=".AlarmReceiver" android:process=":remote" />

trong file manifest. Báo thức sẽ hoạt động ngay cả khi ứng dụng bị giết.

+6

Chào mừng bạn đến với StackOverflow.Hãy cẩn thận khi thêm câu trả lời cho một chuỗi cũ với một số câu trả lời khác, đặc biệt khi một trong số chúng được chấp nhận. Bạn cần giải thích tại sao câu trả lời của bạn tốt hơn bất kỳ câu trả lời nào trong số những câu trả lời hiện có. – APC

3

Đó là hành vi bình thường! Báo thức sẽ ngừng hoạt động khi ứng dụng của bạn chuyển sang chế độ onDestroy().

+0

điều này có thể được thêm vào làm bình luận –

+0

Tôi không thể bình luận danh tiếng ít hơn! –

+0

họ làm điều đó vì một lý do lol – quemeful

Các vấn đề liên quan