在android中定期获取/更新和比较数据?

在android中定期获取/更新和比较数据?,android,Android,我正在创建一个android应用程序,它从天气api以及北极光上的twitter更新中获取本地天气预报,并将两者关联起来。我想知道,即使用户的设备上没有打开应用程序,对我来说,持续更新数据和比较数据的最佳方式是什么?所以本质上我希望我的应用程序在后台运行。任何帮助都会很好 您希望定期重复的任务可以在IntentService中实现 public class MyService extends IntentService { public MyService () { s

我正在创建一个android应用程序,它从天气api以及北极光上的twitter更新中获取本地天气预报,并将两者关联起来。我想知道,即使用户的设备上没有打开应用程序,对我来说,持续更新数据和比较数据的最佳方式是什么?所以本质上我希望我的应用程序在后台运行。任何帮助都会很好

您希望定期重复的任务可以在IntentService中实现

public class MyService extends IntentService {

    public MyService () {
        super("MyService ");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        new MyTask().execute();
        Log.d("MyService", "About to execute MyTask");
    }

    private class MyTask extends AsyncTask<String, Void, Boolean> {
        @Override
        protected Boolean doInBackground(String... strings) {
            Log.d("MyService", "Calling doInBackground within MyTask");
            return false;
        }
    }
}
悬挂式帐篷将被发送至广播接收器,以监听警报:

public class MyAlarmReceiver extends BroadcastReceiver {
    public MyAlarmReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent serviceIntent = new Intent(context, MyService.class);
        context.startService(serviceIntent);
        Log.d("MyAlarmReceiver", "Called context.startService");
    }
}
public class MyBootReceiver extends BroadcastReceiver {

    public MyBootReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        Log.d("MyBootReceiver ", "Boot completed");
        int interval =10*1000;//every 10 second
        AlarmManager alarm = 
           (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

        Intent alarmIntent = new Intent(context, MyAlarmReceiver.class);
        PendingIntent pendingIntent = 
            PendingIntent.getBroadcast(context, 0, alarmIntent, 0);

        alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
                                  System.currentTimeMillis(), 
                                  interval, pendingIntent);
    }
}
每次手机关机时,您设置的闹钟都会自动取消,因此您需要一个广播接收器来监听,以便再次设置闹钟:

public class MyAlarmReceiver extends BroadcastReceiver {
    public MyAlarmReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent serviceIntent = new Intent(context, MyService.class);
        context.startService(serviceIntent);
        Log.d("MyAlarmReceiver", "Called context.startService");
    }
}
public class MyBootReceiver extends BroadcastReceiver {

    public MyBootReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        Log.d("MyBootReceiver ", "Boot completed");
        int interval =10*1000;//every 10 second
        AlarmManager alarm = 
           (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

        Intent alarmIntent = new Intent(context, MyAlarmReceiver.class);
        PendingIntent pendingIntent = 
            PendingIntent.getBroadcast(context, 0, alarmIntent, 0);

        alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
                                  System.currentTimeMillis(), 
                                  interval, pendingIntent);
    }
}
在AndroidManifest.xml中,您需要为BroadcastReceiver添加RECEIVE_BOOT_COMPLETED权限和BOOT_COMPLETED intent筛选器:

<application ...>
    ...
    <receiver
    android:name=".services.MyBootReceiver"
    android:enabled="true"
    android:exported="true" >
    <intent-filter android:priority="500" >
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
    </receiver>
    ...
</application>
...
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

更多详细信息

不要在设备中比较数据,请在服务器中进行比较。如果数据发生更改,则通过GCM或类似技术向设备发送更新。我同意@IllegalArgument。这种任务最好在服务器上完成。您不仅不必担心电池电量,在这种情况下,您还可以将所有注册应用程序中的信息结合起来,以获得更好的整体效果。