A有一個顯示服務器數據的應用程序。我還需要定期從服務器獲取數據(不同的暫停,但是)來緩存它,並在某些情況下發送通知。
通知可以非常重要,這樣的情況時,我使用的服務,它就會被殺死因爲某些原因和緩存時間將被跳過不應該出現(或者,如果它是不可能的,我應該儘量減少跳過時間)。此緩存過程應在系統引導(無論應用程序是否正在運行)後開始,並在設備開啓時始終執行。
那麼我應該使用什麼方法?選擇定期與服務器同步數據的方法android
0
A
回答
0
在你的情況下,最合適的是使用Service
不斷更新數據源中的數據。至於它自己的數據,我認爲在你的情況下,你最好創建一個SQLite
數據庫,以便在系統重啓時保留你的數據。
0
我曾經服務這樣
這可能會幫助你
public class MyService extends Service {
int counter = 0;
static final int UPDATE_INTERVAL = 60 * 1000; ///1000 = 1 second
private Timer timer = new Timer();
JsonParsers jsonParser = new JsonParsers();
private static final String TAG_SUCCESS = "success";
private static String url_create_product = "http://ayyappagold.com/ayyappa/index.php";
@Override
public IBinder onBind(Intent intent) {
// Not implemented...this sample is only for starting and stopping
// services.
// Service binding will be covered in another tutorial
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Announcement about starting
Toast.makeText(this, "Starting the Service", Toast.LENGTH_SHORT).show();
// Start a Background thread
doSomethingRepeatedly();
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
private void doSomethingRepeatedly() {
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
doIn();
Calendar c = Calendar.getInstance();
String month = String.valueOf(c.get(Calendar.MONTH) + 1);
String year = String.valueOf(c.get(Calendar.YEAR));
String day = String.valueOf(c.get(Calendar.DAY_OF_MONTH));
String months = null;
if (month.startsWith("0") || month.startsWith("1")) {
if (day.startsWith("0") || day.startsWith("1")
|| day.startsWith("2") || day.startsWith("3")) {
months = year + "-" + month + "-" + day;
}
} else {
months = year + "-" + "0" + month + "-0" + day;
}
loadJewelDetails(months);
}
}, 0, UPDATE_INTERVAL);
}
@Override
public void onDestroy() {
super.onDestroy();
if (timer != null) {
timer.cancel();
}
Toast.makeText(this, "Stopping the Service", Toast.LENGTH_SHORT).show();
}
public void set_alarm(int year, int month, int day, String title,
String text, String billno) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, month - 1);
cal.set(Calendar.YEAR, year);
cal.set(Calendar.DAY_OF_MONTH, day);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
Intent intent = new Intent(getApplicationContext(), AlarmActivity.class);
intent.putExtra("title", title);
intent.putExtra("text", text);
intent.putExtra("billno", billno);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
getApplicationContext(), 1234, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
@SuppressWarnings("static-access")
AlarmManager alarmManager = (AlarmManager) getApplicationContext()
.getSystemService(getApplicationContext().ALARM_SERVICE);
alarmManager.cancel(pendingIntent); // cancel any existing alarms
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY,
pendingIntent);
Database db = new Database(getApplicationContext());
db.insertFlg(1, billno);
}
public void loadJewelDetails(String month) {
try {
Cursor cursor = null;
Database db = new Database(getApplicationContext());
cursor = db.getGoldPush(month);
if (cursor.getCount() != 0) {
if (cursor.moveToFirst()) {
do {
String billno = cursor.getString(cursor
.getColumnIndex("id"));
String title = "Ayyappa Gold";
String name = cursor.getString(cursor
.getColumnIndex("items"));
String dates = cursor.getString(cursor
.getColumnIndex("date"));
String yr = dates.substring(0, 4);
int year = Integer.parseInt(yr);
String mon = dates.substring(5);
String mo = mon.substring(0, 2);
int months = Integer.parseInt(mo);
String da = dates.substring(9);
int day = Integer.parseInt(da);
String tex = name.replace("*", "\n");
String text = tex;
// Ask our service to set an alarm for that date,
// this
// activity talks to the client that talks to the
// service
int flg = getFlag(billno);
if (flg == 0) {
set_alarm(year, months, day, title, text, billno);
}
System.out.println(dates);
} while (cursor.moveToNext());
}
}
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
// looping through All Contacts
}
public int getFlag(String bill) {
int flag = 0;
try {
Cursor cursor = null;
Database db = new Database(getApplicationContext());
cursor = db.getFlag(bill);
if (cursor.getCount() != 0) {
if (cursor.moveToFirst()) {
do {
flag = Integer.parseInt(cursor.getString(cursor
.getColumnIndex("flag")));
} while (cursor.moveToNext());
}
}
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
// looping through All Contacts
return flag;
}
public void doIn() {
// Building Parameters
int id = getId();
String name = String.valueOf(id);
Database db = new Database(getApplicationContext());
System.out.println("read the Gold and Silver rate details");
JSONArray jsonarr = null;
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("start", name));
// getting JSON Object
// Note that create product url accepts POST method
JSONObject json = jsonParser.makeHttpRequest(url_create_product,
"POST", params);
// check log cat fro response
Log.d("Create Response", json.toString());
// check for success tag
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// Getting Array of Contacts
jsonarr = json.getJSONArray("ayyappagolddetails");
for (int i = 0; i < jsonarr.length(); i++) {
JSONObject c = jsonarr.getJSONObject(i);
String billno = c.getString("id");
String item = c.getString("items");
String date = c.getString("date");
String time = c.getString("time");
db.addGoldItemDetails(billno, item, date, time);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
public int getId() {
int id = 0;
try {
System.out.println("read the id value");
Cursor cursor = null;
Database db = new Database(getApplicationContext());
cursor = db.getId();
if (cursor.getCount() != 0) {
if (cursor.moveToFirst()) {
do {
id = Integer.parseInt(cursor.getString(cursor
.getColumnIndex("id")));
} while (cursor.moveToNext());
}
}
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
// looping through All Contacts
System.out.println("last id value is" + id);
return id;
}
}
相關問題
- 1. 同步Android數據庫與服務器數據庫
- 2. 同步本地數據庫(Sqlite)與服務器數據庫android
- 3. 同步數據庫與服務器
- 4. 與服務器同步數據
- 5. 與服務器同步GIT
- 6. 同步PouchDB與服務器
- 7. 同步android應用程序與Web服務器數據庫的數據庫
- 8. 同步本地SQLite數據庫與服務器SQLite數據庫
- 9. 同步本地數據庫windows phone與數據庫服務器
- 10. Xamarin與服務器形成本地數據庫數據同步
- 11. 與服務器同步多個客戶端的最佳方法
- 12. 將Android手機與第三方服務器同步
- 13. 同步插入數據庫並選擇Web服務
- 14. WCF服務方法同步/異步
- 15. Sql服務器數據庫同步
- 16. Android AccountAuthenticator和同步服務:顯示在「同步和數據」下
- 17. 從設備sqlite到服務器的Android數據同步
- 18. 通過REST API處理Android服務和服務器之間的數據同步
- 19. SQL服務器選擇行與數
- 20. 同步客戶端數據庫與服務器數據庫與篩選的數據
- 21. 與FTP服務器的文件同步
- 22. 如何在android應用程序中同步服務器數據?
- 23. 從服務器和Android設備同步數據
- 24. 如何將數據庫與微服務(和新服務)同步?
- 25. 用java同步兩臺不同服務器的方法
- 26. 當應用程序關閉時與服務器同步數據
- 27. 與服務器脫機數據庫同步
- 28. 領域數據庫:與服務器同步
- 29. 與網絡服務器同步核心數據
- 30. 與網絡服務器同步設備數據
我想過這個問題,但是服務有時會被殺死。警報管理器或其他方法是否更可靠? – Natalia 2013-04-08 11:45:36
您可以使用警報管理器在操作系統殺死它時再次啓動服務,但應使用服務AFAIK完成數據同步。 – 2013-04-08 12:24:10