0

我有联系人列表,可以在一段时间内保存。我应该每天更新储蓄条款。简单地说,每天所有联系人的条款减去一天。

我看到两种可能的解决方案:

1)服务,每天指定时间使用AlarmManager更新内容。

2)记住应用程序的最后一次启动,检查差异并从存储的条款中扣除此差异。

在我看来,第二种方法的性能效率更高。有人可以建议吗?

4

2 回答 2

0

如果您打算每天使用 AlamManager 运行一次服务,它的性能/电池效率将更高。

如果服务不必在每天的确切时刻运行,则可以通过使用RTC而不是RTC_WAKEUP.

这样您的应用程序不会唤醒 CPU,而是在用户再次使用手机时执行任务。(如果警报已经迟到)。但是,如果该服务每天没有运行多次,您仍然不必太担心......把它想象成一个闹钟,每天通过响铃唤醒您,不会耗尽您的电池。

于 2013-08-13T15:46:41.283 回答
0

我解决了我的问题。

我使用方法,该方法在类中的 onCreate() 方法中调用,该方法从 Application 类扩展:

private void setRecurringAlarm(Context context) {
               Intent intent = new Intent(AlarmReceiver.ACTION_ALARM);
                  AlarmManager alarms = (AlarmManager) this
                         .getSystemService(Context.ALARM_SERVICE);
               final PendingIntent pIntent = PendingIntent.getBroadcast(this,
                 1234567, intent, PendingIntent.FLAG_UPDATE_CURRENT);

               alarms.setRepeating(AlarmManager.RTC_WAKEUP,
                 System.currentTimeMillis(), AlarmManager.INTERVAL_DAY, pIntent);

              Toast.makeText(getApplicationContext(), "started", Toast.LENGTH_SHORT).show();
    }

我的 AlarmReceiver 类:

  public class AlarmReceiver extends BroadcastReceiver {

    private static final String DEBUG_TAG = "AlarmReceiver";
    public static String ACTION_ALARM = "com.alarammanager.alaram";
    @Override
    public void onReceive(Context context, Intent intent) {

        Intent downloader = new Intent(context, UpdateService.class);
        downloader.setAction(Constants.UPDATE_SERVICE);
        context.startService(downloader);
        Toast.makeText(context, "Entered", Toast.LENGTH_SHORT).show();
    }
}

和我的服务,其中执行所需的操作:

      public class UpdateService extends IntentService {

        Boolean isRunning = false;
        private ContentRepository _contentRepo;
        public UpdateService() {
            super("UpdateService");
        }
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            faq = new FrequentlyUsedMethods(this);
            _contentRepo = new ContentRepository(this.getContentResolver(), this);
            this.context = this;
            if (!isRunning)
                archiveDaysDeduct();

            return START_REDELIVER_INTENT;
        }

    private void archiveDaysDeduct() 
        {
            isRunning = true;
            Log.i("updateService", "archiveDaysDeduct");
            ArrayList<ContactItem> contacts = faq.getDisplayContacts(this);
         Toast.makeText(getApplicationContext(), "update service and I'm here", Toast.LENGTH_LONG).show();
            DatabaseHandler db = new DatabaseHandler(context.getApplicationContext());
            Dao<ContactItem,Integer> daoContact = null;

            String yourDate = faq.getCurrentDate();
            if (SharedPrefs.getInstance().getSharedPrefs()!=null)

                if (!SharedPrefs.getInstance().getSharedPrefs().getString(Constants.CURRENT_DATE, "").equalsIgnoreCase(yourDate))
                {       
SharedPrefs.getInstance().getSharedPrefs().edit().putString(Constants.CURRENT_DATE, yourDate);

                     try {
                         daoContact = db.getContactDao();
                     }
                     catch(Exception e)
                     {
                         e.printStackTrace();
                     }
                     Toast.makeText(getApplicationContext(), "I'm going to decrement the save dates", Toast.LENGTH_SHORT).show();
                    UpdateBuilder<ContactItem, Integer> updateBuilder = daoContact.updateBuilder();
                     DeleteBuilder<ContactItem, Integer> daoContactDelete = daoContact.deleteBuilder();
                     Log.i("contacts size in update service", Integer.toString(contacts.size()));
                    for (ContactItem a : contacts)
                    {
                        if (a.getDays()==0)
                        {
                            try {

                                daoContactDelete.where().eq("id", a.getId());
                                daoContact.delete(daoContactDelete.prepare());

                            } 
                            catch (SQLException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }

                        }
                        else 
                        {
                            try {
                                Log.i("contacts to update days", a.toString());
                                a.setDays(a.getDays()-1);
                                daoContact.update(a);
                            } catch (SQLException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }
                    stopSelf();

                }
            }
        }
    }
于 2013-08-27T11:44:39.947 回答