创建一个Android后台服务,持续轮询REST API以获取数据

时间:2016-08-26 15:10:57

标签: android android-service android-syncadapter

我需要编写一个Android服务,轮询服务器以获取数据,解析数据,然后通过意图将其发送到应用程序。轮询必须经常进行(每隔几秒钟)。根据我的阅读,不推荐这样的轮询(由于电池寿命问题)。这是我第一次在Android上开发,经过大量的研究后,我还有一些不清楚的事情。

我不确定服务,同步适配器或警报管理器是否更适合我的需求。在这个问题的背景下哪一个最有意义?

此服务需要在启动时启动并继续在后台运行。轮询服务器后,数据将通过意图发送到另一个应用程序。该服务应该完全没有用户交互。从我所看到的,似乎Android试图阻止人们因恶意软件问题而编写此类内容。是否有可能实现这一目标?

2 个答案:

答案 0 :(得分:3)

首先,创建一个服务类,它将在给定的时间间隔后运行处理程序,

  public class SyncService extends Service {

   private Handler mHandler;
   // default interval for syncing data
    public static final long DEFAULT_SYNC_INTERVAL = 30 * 1000;

        // task to be run here
        private Runnable runnableService = new Runnable() {
            @Override
            public void run() {
                syncData();
                // Repeat this runnable code block again every ... min
                mHandler.postDelayed(runnableService, Constant.DEFAULT_SYNC_INTERVAL);
            }
        };

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            // Create the Handler object
            mHandler = new Handler();
            // Execute a runnable task as soon as possible
            mHandler.post(runnableService);

            return START_STICKY;
        }

        private synchronized void syncData() {
            // call your rest service here
        }
    }

syncData()方法内部放置您的REST API调用,该调用将在30秒间隔后调用。

关于启动时的服务启动,使用广播接收器,一旦启动完成就会触发服务,例如,

<receiver android:name=".BootCompletedIntentReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

剩下的事情取决于你!请先尝试自己,然后再回来寻求帮助!

答案 1 :(得分:1)

您需要使用BroadcastReceiver来使用BOOT_COMPLETED过滤器检测启动事件。然后,您需要启动IntentService来查询您的服务。

第1步:向您的清单添加权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

第2步:注册您的服务

<receiver android:name="com.myapp.BootReceiver">
  <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
  </intent-filter>
</receiver>

第3步:创建BootReceiver

public class BootReceiver extends BroadcastReceiver {

@Override 
public void onReceive(Context context, Intent intent) {
    if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
        // Start your intent service
        ... 
     } 
  }
} 

第4步:开始并创建IntentService

...    
Intent i = new Intent(context, BackgroundService.class);
context.startService(i);
...

第5步:一旦有效,请使用AlarmManager安排IntentService每隔x时间运行一次。

如果您有更多问题,请与我们联系!