即使应用已关闭,也可以在Android中向服务器发布数据的服务(离线到在线)

时间:2016-02-04 07:36:09

标签: android performance android-intent broadcastreceiver android-service

我正在开发一个Android应用程序,它将从用户(形式,模拟聊天)获取输入并将其存储在本地数据库中。 我已创建BroadcastReceiver以获取网络更改状态,如果已连接,我开始将数据发布到服务器。

public class NetworkChangeReceiverService extends BroadcastReceiver {

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

        if (Connectivity.isConnected(context)) {
            Logger.d("Connected to internet");
            // Post data to the server.
        } else {
            Logger.d("Not connected to internet");
        }
    }
}

这是正确的做法吗?如果您指定将数据发布到服务器的详细信息将是一个很大的帮助,比如我应该使用AsyncTask还是只使用简单的Retrofit事情,我希望在接收器和发布工作时保持尽可能低的内存消耗在后台。 Alos,如果,可能想知道WhatsApp的工作原理。

1 个答案:

答案 0 :(得分:0)

您可以编写服务和AlarmManager来执行此操作。只需在服务中注册您的应用程序并调用alarmMangaer.setRepeat()方法即可启动您的服务器代码或您想要在onStart()服务方法中执行的任何其他操作。

public class MyService extends Service{
  Calendar cur_cal = Calendar.getInstance();
  @Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    Intent intent = new Intent(this, MyService.class);
    PendingIntent pintent = PendingIntent.getService(getApplicationContext(),
            0, intent, 0);
    AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            cur_cal.setTimeInMillis(System.currentTimeMillis());
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, cur_cal.getTimeInMillis(),
            60 * 1000*3, pintent);
}
@Override
public void onStart(Intent intent, int startId) {
    // TODO Auto-generated method stub
    super.onStart(intent, startId);
          // your code for background process
  }
}

在AndroidManifest.xml中添加此内容

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<service
        android:name="com.yourpackage.MyService"
        android:enabled="true" />
  <receiver android:name=".BootCompletedIntentReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

编辑:BootCompletedIntentReceiver.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class BootCompletedIntentReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
            Intent pushIntent = new Intent(context, MyService.class);
            context.startService(pushIntent);
        }
    }
}