我正在开发一个Android应用程序,它可以在多个小时内收集传感器数据.为此,我们有一个收集传感器数据的服务(例如加速,GPS,......),进行一些处理并将它们远程存储在服务器上.
目前,此服务在一个单独的进程中运行(在清单中使用android:service =":background").这使活动和服务之间的通信变得复杂,但我的前任以这种方式创建了应用程序,因为他们认为将服务与活动分开会使其更稳定.
我想要运行一个单独的流程的更多事实原因.有什么好处?它真的运行得更稳定吗?如果服务器处于单独的进程中,那么服务器是否更不可能被服务器(为了释放资源)而被杀死?
我们的应用程序使用startForeground()和朋友来最小化被操作系统杀死的可能性.
Android文档对此并不十分具体,主要表明它取决于应用程序的用途;-)
TL; DR将长期运行的服务放在一个单独的进程(在Android中)的客观原因是什么?
更新: 自己找到答案,见下文:-)
嗨,
我目前正在编写一个Android应用程序,它使用HTTP Post和AsyncTask在后台提交内容.为此我使用org.apache.http.client包.我的代码基于这个例子.
基本上,我的代码看起来像这样:
public void postData() {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://192.168.1.137:8880/form");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("id", "12345"));
nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
Log.e(TAG,e.toString());
} catch (IOException e) {
Log.e(TAG,e.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
问题是httpclient.execute(..)行需要大约1.5到3秒,我不明白为什么.仅使用HTTP Get请求页面大约需要80 ms左右,因此问题似乎不是网络延迟本身.
问题似乎也不在服务器端,我也尝试将数据发布到http://www.disney.com/同样慢的结果.Firebug在本地向我的服务器发送数据时显示1 …
我们有一项服务,可以持续收集手机上的传感器数据.该服务应该"永久"运行,例如只要用户想要,而不是被系统杀死.
为了澄清,该服务不适用于在市场上向公众发布的应用程序,它是为科学研究而编写的.所以运行该应用程序的人都充分意识到他们的电池将比平时更快地吸空,这是没问题的.
无论如何,我的问题是服务在运行一段时间后被杀死了.有时一小时后,有时仅在7小时后10小时.
服务被杀死时的Log-Entries看起来像这样.它只是说" 不再需要 ",有时甚至没有调用onDestroy(),据我所知.
07-20 17:07:11.593 I/ActivityManager( 85): No longer want my.project.datalogging (pid 23918): hidden #16
07-20 17:07:11.593 I/WindowManager( 85): WIN DEATH: Window{44c61570 my.project.datalogging/my.project.datalogging.DataLoggingApp paused=false}
07-20 17:07:11.603 I/BackgroundService(23925): onDestroy()
Run Code Online (Sandbox Code Playgroud)
或者稍后(在我手动重启之后):
07-20 19:00:49.677 I/ActivityManager( 85): No longer want my.project.datalogging:BackgroundService (pid 24421): hidden #17
07-20 19:00:49.677 I/ActivityManager( 85): No longer want my.project.datalogging (pid 24415): hidden #18
07-20 19:00:49.807 85 10707 I WindowManager: WIN DEATH: Window{44f1ea58 my.project.datalogging/my.project.datalogging.DataLoggingApp paused=false}
Run Code Online (Sandbox Code Playgroud)
我经常看到其他服务被" 不再需要 " 杀死,然后立即重新启动" 调度重启崩溃服务 ".例如,这里有runkeeper:
07-20 17:30:45.503 I/ActivityManager( 85): No …Run Code Online (Sandbox Code Playgroud)