如何在Android应用程序的后台进行网络请求?
问题描述:
我是一名初学者程序员,制作了一个简单的应用程序,它向api发送一个HTTP请求并获取一些信息。我希望应用程序继续这样做,并在每个小时自动更新一次。我已经成功地使用HttpURLConnection,一个扩展AsyncTaskLoader的Loader,以及一个Handler和Runnable,可以在固定的时间重新启动加载器。如何在Android应用程序的后台进行网络请求?
当应用程序处于前台时,此功能正常工作,但只要切换到其他应用程序或关闭屏幕,它就会停止工作。我尝试使用部分唤醒锁来保持应用程序正常运行,但尽管应用程序正在运行,但一旦它停止在前台,所有网络活动都会停止,并且我得到一个不活动的InputConnection
警告消息。有什么我可以做的,以保持这个连接活动时,应用程序在后台?
答
尝试使用服务。
服务
public class TimeService extends Service {
// constant
public static final long NOTIFY_INTERVAL = 10 * 1000; // 10 seconds
// run on another Thread to avoid crash
private Handler mHandler = new Handler();
// timer handling
private Timer mTimer = null;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
// cancel if already existed
if(mTimer != null) {
mTimer.cancel();
} else {
// recreate new
mTimer = new Timer();
}
// schedule task
mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);
}
class TimeDisplayTimerTask extends TimerTask {
@Override
public void run() {
// run on another thread
mHandler.post(new Runnable() {
@Override
public void run() {
// display toast
Toast.makeText(getApplicationContext(), getDateTime(),
Toast.LENGTH_SHORT).show();
}
});
}
private String getDateTime() {
// get date time in custom format
SimpleDateFormat sdf = new SimpleDateFormat("[yyyy/MM/dd - HH:mm:ss]");
return sdf.format(new Date());
}
}
舱单
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".TimeService"/>
</application>
Main类
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(this, TimeService.class));
}