2017-02-09 106 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(); 
     } 
    } 
}