2017-02-09 105 views
0

首先我想每天自动更改textview文本。例如,第一天textview文本是“第一文本”,第二天文本是“第二文本”,在8点钟eveyday。文本是永久的,直到第二天8点。每天自动更改textview

我尝试这段代码,但我的问题是,如果用户在8点没有打开此页面,则不会触发代码。文本里面“mquote阵”

SharedPreferences pref =getApplicationContext().getSharedPreferences("myPrefsKey",Context.MODE_PRIVATE) ; 
    dayCount = pref.getInt("dayCount", 0); 


    Calendar cal = Calendar.getInstance(); 
    int hour=cal.get(Calendar.HOUR_OF_DAY); 
    int minute=cal.get(Calendar.MINUTE);   


    if ((hour==8 && minute==1)) 
     updateQuote(); 


tvQuote.setText(mquote.getQuote(dayCount)); 

public void updateQuote() 
{ 

     if (dayCount==4) 
      dayCount=0; 
    dayCount++; 
    pref.edit().putInt("dayCount",dayCount).apply(); 


} 
+0

检查这个https://developer.android.com/training/scheduling/alarms.html – uguboz

+0

而不是检查准确时间(8:01) ,检查它是否大于某个值。 –

+0

这不起作用,因为您正在检查时间是8:01。你应该检查时间是否大于8:00,如果你仍然在同一天。 – zed

回答

0

商店毫秒时,你上次在你的喜好更新喜好:

SharedPreferences pref = getApplicationContext().getSharedPreferences("msKey", Context.MODE_PRIVATE); 
msCount = pref.getInt("msCount", 0); 

long milliseconds = System.currentTimeMillis(); 

long diff = milliseconds - msCount; 

diff += (8 * 60 * 60 * 1000); // compensating difference for 8'O clock condition 

int days = (int) Math.ceil(diff/24/60/60/1000); 

days %= 4; // Because you were resetting days count after 4 increments 

updateQuote(days); 

public void updateQuote(days) { 

    if(days == 0) { 
     pref.edit().putInt("msCount", milliseconds).apply(); 
    } 

} 
+0

感谢您的回答。我认为这是很好的算法,但它不起作用。当时间是8点时,文本不会始终更新。 – xamarin

+0

听起来很愚蠢,但是,我没有把'tvQuote.setText(mquote.getQuote(dayCount));'在我的回答中,你是否错过了它?另外,我将'days'传递给'updateQuote'方法。 – BhalchandraSW

+0

我更新了textview中updateQuote方法中的天数[tvQuote.setText(mquote.getQuote(days));'我错了吗? – xamarin

0

您应该使用时间戳能够比较两个日期。试试这个代码。 但是,1天发生在用户使用应用程序时,它不会触发。如果你想克服这个问题,那么使用AlarmManager每天触发一个事件。

SharedPreferences pref = getApplicationContext().getSharedPreferences("myPrefsKey",Context.MODE_PRIVATE); 

lastDay_ms= pref.getInt("time_ms", 0); 
Calendar today = Calendar.getInstance(); 

long diff = today.getTimeInMillis() - lastDay_ms; //result in millis 

final long ONE_DAY = 24*60*60*1000; //millis in a day 

if (diff > ONE_DAY) 
    updateQuote(); 
+0

我认为AlarmManager适合。你首先建议AlarmManager。谢谢你的回答。 @uguboz – xamarin

0

你需要一个AlarmManager实现:

public class AlarmReceiver extends BroadcastReceiver { 

    // The app's AlarmManager, which provides access to the system alarm services. 
    private AlarmManager alarmMgr; 
    // The pending intent that is triggered when the alarm fires. 
    private PendingIntent alarmIntent; 

    public void setAlarm(Context context) { 

     alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     Intent intent = new Intent(context, AlarmReceiver.class); 
     alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 

     // set the Alarm's trigger time to 8:00 a.m. 
     calendar.set(Calendar.HOUR_OF_DAT, 9); 

     // Set the alarm to fire at approximately 8:30 a.m., according to the device's 
     // clock, and to repeat once a day. 
     alarmManager.setInexactRepeating(AlarmManager.RTC, 
      calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent); 

    } 

    public void onReceive(Context context, Intent intent) { 

     if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) 
     { 
      alarm.setAlarm(context); 
     } else if(Objects.equals(intent, alarmIntent)) { 
      SharedPreferences pref = getApplicationContext().getSharedPreferences("key", Context.MODE_PRIVATE); 
      int dayCount = pref.getInt("dayCount", 0); 
      dayCount %= 4; 
      pref.edit().putInt("dayCount", ++daysCount).apply(); 
     } 
    } 
}