7

Ứng dụng của tôi có tiện ích hiển thị ngày hôm nay và cần được cập nhật vào nửa đêm. Các widget được định nghĩa trong biểu hiện nhưCách cập nhật tiện ích ứng dụng vào nửa đêm?

<manifest> 
    ... 
    <application> 
     ... 
     <receiver 
      android:name=".MyWidgetProviderClass" 
      android:label="MyLabel" > 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      </intent-filter> 

      <meta-data 
       android:name="android.appwidget.provider" 
       android:resource="@xml/widget_icon_info" /> 
     </receiver> 
    </application> 
</manifest> 

Và file info widget là

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:initialLayout="@layout/my_layout" 
    android:minHeight="40dp" 
    android:minWidth="294dp" 
    android:updatePeriodMillis="3600000" > 
</appwidget-provider> 

Điều này làm cho phụ tùng để được cập nhật bất cứ lúc nào giữa nửa đêm và 1:00 nhưng tôi muốn để có được cập nhật gần gũi hơn với nửa đêm vì vậy tôi thêm vào ứng dụng một máy thu ý định

<receiver 
    android:name=".MyWidgetUpdaterClass" 
    android:enabled="true" > 
    <intent-filter> 
     <action android:name="MyAction" /> 
     </intent-filter> 
</receiver> 

và một phương pháp tĩnh

public static void setMidngintAlarms(Context context) { 
    Intent intent = new Intent("MyAction"); 
    PendingIntent pendingIntent = 
     PendingIntent.getBroadcast(context, 0, intent, 0);    
    long interval = 24*60*60*1000;   
    long firstTime = SystemClock.elapsedRealtime() + 
     millisecondsToNextMidnight(); 
    AlarmManager am = (AlarmManager)context.getSystemService(
     Context.ALARM_SERVICE); 
    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
        firstTime, interval, pendingIntent); 
} 

(do yêu cầu của người quản lý báo động với cùng một ý định ghi đè lên nhau không có hại trong bộ gọi điện thoạiMidngintAlarms nhiều lần).

Tôi đã thử gọi setMidnightAlarms() từ vài địa điểm (từ hoạt động chính của ứng dụng, từ onUpdate của AppWidgetProvider(), v.v.). Tất cả mọi thứ hoạt động tốt và ý định quản lý báo động được nhận và widget được cập nhật nhưng chỉ miễn là ứng dụng chạy. Nếu tôi giết ứng dụng, các tiện ích sẽ ngừng cập nhật vào nửa đêm.

Bất kỳ ý tưởng nào làm cho các tiện ích cập nhật vào nửa đêm? Tôi có cần thêm dịch vụ không? Nếu thế thì sao? Ví dụ nào?

Tôi hơi ngạc nhiên một chút về tầm quan trọng của việc sử dụng chức năng cơ bản này.

+0

Tiện ích vẫn nên cập nhật vì bạn đang đặt báo thức cho nó. Vì vậy, nó không quan trọng cho dù các ứng dụng đang chạy hay không. Nó hoạt động nếu thiết bị khởi động lại và bạn không đăng ký báo thức ngay từ đầu. –

+0

Khi báo thức lặp lại được đặt và không bao giờ bị hủy một cách rõ ràng. Trong điều kiện nào hệ thống android hủy bỏ nó, nếu có? Tôi không thể tìm thấy thông tin có liên quan. Ví dụ, nó có liên quan đến hoạt động hoặc dịch vụ đã gửi hay nó tồn tại mãi mãi độc lập? – user1076637

Trả lời

0

tôi giải quyết vấn đề này bằng cách:

  1. Bắt đầu một dịch vụ để nghe thông điệp Intent.ACTION_TIME_TICK. Sau đó gửi một chương trình phát sóng tới tiện ích con nếu Thời gian TICKED. (Mỗi phút).

  2. Nhận phát sóng trong widget và thẩm phán thời tiết nó là nửa đêm bởi:

Code:

if (MyWidget.BROADCAST_TIME_TICK.equals(action)) { 
     //If it's midnight, then update. 
     int hour = Calendar.getInstance().get(Calendar.HOUR); 
     int minute = Calendar.getInstance().get(Calendar.MINUTE); 
     Utils.log(TAG, "time is : " + hour+":" + minute); 
     if (!(hour == 0 && minute == 0)) { //Only update at midnight's time tick. 
      return; 
     } else { 
      //Do the midnight stuff. 
     } 
    } 
0

quảng cáo này để nhận phụ tùng biểu hiện của bạn

<intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> 
      <action android:name="android.intent.action.DATE_CHANGED" />... 

sự thay đổi trong ngày sẽ kích hoạt onReceive() của bạn để khởi động với "android.intent.action.DATE_CHANGED" action