目前我只能在我的应用(活动)处于前台时将数据发送到服务器。至少在4.1.3中会发生这种情况,因为Android SO会暂停应用程序或停止它。
即使活动在后台,我也需要一直发送数据。
实现这一目标的最佳方式是什么? Asynctask不是一个好的答案,因为我想定期发送数据。不止一次。我已经使用asynctasks作为向服务器发送数据的一种方式,我需要的是与活动一起运行但不会被SO停止的东西。
编辑:
我使用以下代码收到此错误。
04-03 13:55:28.804: E/AndroidRuntime(1165): java.lang.RuntimeException: Unable to instantiate receiver main.inSituApp.BootCompletedIntentReceiver: java.lang.ClassNotFoundException: main.inSituApp.BootCompletedIntentReceiver
谁能告诉我这个错误意味着什么?我没有这个接收器的课程,但是如果我在清单中注册它我就不需要了。
答案 0 :(得分:4)
您可以写services
和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);
}
}
}