2013-08-13 44 views
5

Tôi đang phát triển một ứng dụng nhiệm vụ đơn giản trong Android và tôi cần tạo thông báo qua AlarmManager. Vấn đề của tôi là tôi có một số báo động nhất định sẽ bị xóa - và do đó thông báo của chúng - nhưng chúng không, vì vậy tôi đã quyết định các bài đăng sau đây như Delete alarm from AlarmManager using cancel() - Android để biến AlarmManager thành biến tĩnh để có thể đạt được cùng một thể hiện từ toàn bộ ứng dụng. Con đường tôi đang làm điều này là có các phương pháp sau đây trong lớp học chính của tôi:static AlarmManager trong Android

public static AlarmManager getAlarmManagerInstance() { 
     if (sAlarmManager == null && sContext != null) 
      sAlarmManager = (AlarmManager) sContext 
        .getSystemService(Context.ALARM_SERVICE); 
     return sAlarmManager; 
    } 

và trong biến sContext sẽ được khởi tạo theo cách này:

@Override 
    protected void onCreate(Bundle bundle) { 
     super.onCreate(bundle); 
     setContentView(R.layout.activity_main); 
     sContext = this; 
     initActionBar(); 
    } 

có phải là một ý tưởng tốt để tạo ra một mẫu đơn từ biến này? Có cách tiếp cận nào tốt hơn không?

Cảm ơn rất nhiều trước.

+0

sử dụng id tương tự để tạo cấp phát ý .. sẽ thực hiện cùng một công việc –

+0

nhưng tôi đang sử dụng id của các tác vụ tôi muốn tạo/sửa đổi để tạo ra mục đích đang chờ xử lý, theo cách như 'PendingIntent pendingFirstAlarmIntent = PendingIntent.getBroadcast ( \t \t \t \t \t này, mGoal.getId() intValue(), ý định, \t \t \t \t \t PendingIntent.FLAG_ONE_SHOT);. '.. là nó vẫn giống nhau không? – noloman

+0

Có điều này là giống nhau ... Nếu điều này không hủy báo thức, hãy thử sử dụng các cờ khác nhau ... –

Trả lời

1

tài liệu Android nói:

Bạn không khởi tạo lớp này trực tiếp; thay vào đó, hãy truy xuất nó thông qua Context.getSystemService (Context.ALARM_SERVICE).

AlarmManager chỉ là lớp cung cấp quyền truy cập vào các dịch vụ cảnh báo hệ thống.

Dịch vụ này đang chạy trong hệ thống nên đừng quan tâm đến chúng chỉ cần sử dụng AlarmManager làm giao diện để tương tác với chúng.

Vì vậy, mỗi khi bạn cần phải truy cập vào dịch vụ này chỉ lấy nó như là tài liệu hướng dẫn nói:

Context.getSystemService (Context.ALARM_SERVICE)

1

Tôi khuyên bạn không nên tạo Báo thức tĩnh.

Bạn nên làm theo lời khuyên được đưa ra trong các nhận xét, để sử dụng ID được cấp cho PendingIntents, theo cách này bạn có thể hủy/cập nhật báo thức của mình chắc chắn từ bất kỳ vị trí nào trong ứng dụng của bạn.

Lý do tại sao tôi khuyên chống báo động tĩnh:

Các kịch bản sau đây có thể xảy ra, bạn sắp xếp các báo động và làm cho một tham chiếu tĩnh để nó, sau đó người dùng khởi động lại điện thoại. Báo thức của bạn đã biến mất và do đó là tham chiếu tĩnh đến nó.

Nếu bạn cần báo thức hoạt động trong trường hợp như vậy, bạn nên viết id và thông tin bắt buộc trong tùy chọn/cơ sở dữ liệu/tệp được chia sẻ và lên lịch lại onBoot hoặc trên một số sự kiện khác phù hợp với ứng dụng của bạn.

+0

nhưng tôi đã có 'BroadcastReceiver' với quyền' ACTION_BOOT_COMPLETED' để có thể tạo lại báo thức từ DB khi khởi động lại điện thoại. Tôi chỉ không hiểu điều sử dụng các ID trong 'PendingIntent', vì tôi nghĩ rằng tham số mà chúng ta truyền cho' PendingIntent' được cho là ID của các tác vụ chứ không phải là báo động. – noloman

+0

Nếu bạn không đặt ID, khi bạn tạo một PendingIntent với Intent bắt đầu cùng một hoạt động/dịch vụ (các giá trị khác nhau không tính) Android sẽ không thể tạo sự khác biệt giữa chúng và khi bạn đóng gói chúng trong Alarms khi bạn lên lịch chúng, kết quả cuối cùng sẽ là mỗi lần bạn tạo một báo thức mới, báo thức cũ sẽ tự động bị hủy mà bạn không biết. Và kể từ khi bạn nói AlarmManagers của bạn được kết nối với các thông báo của bạn sau đó bạn nên sử dụng ID khác nhau, có thể sử dụng cùng một ID như cho thông báo nếu bạn đã cho họ ID duy nhất – JanBo

+0

http://stackoverflow.com/questions/7496603/how-to- create-different-pendingintent-so-filterequals-return-false ... cũng xem xét việc thiết lập một hành động cho mục đích của bạn, và bạn có thể lọc chúng theo cách đó nếu bạn không thích thiết lập một id cho PendingIntent. – JanBo

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