在我的应用程序中,我在应用程序打开时获取当前位置的纬度和经度,但在应用程序关闭时则不会.
我正在使用Service类来获取我的应用程序中的当前位置纬度和经度.
即使应用程序关闭,请告诉我如何获取当前位置的纬度和经度
在某些情况下,我的服务可能会尝试在不应该启动时启动.在这样的情况下stopSelf(),在onStartCommand()方法内部调用是不好的形式?如果是这样,处理这种情况的最佳方法是什么?任何资源将不胜感激.
我有一个音乐播放器,试图启动Service中onResume()的一个Activity.为清晰起见,我删除了几行,但代码有效:
@Override
protected void onResume() {
super.onResume();
startService(new Intent(this, MusicService.class));
}
Run Code Online (Sandbox Code Playgroud)
根据崩溃日志,这在运行Android P的某些设备上抛出异常:
Caused by java.lang.IllegalStateException: Not allowed to start service Intent { cmp=another.music.player/com.simplecity.amp_library.playback.MusicService }: app is in background uid UidRecord{6a4a9c6 u0a143 TPSL bg:+3m25s199ms idle change:cached procs:1 seq(1283,1283,1283)}
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1577)
at android.app.ContextImpl.startService(ContextImpl.java:1532)
at android.content.ContextWrapper.startService(ContextWrapper.java:664)
at android.content.ContextWrapper.startService(ContextWrapper.java:664)
at com.simplecity.amp_library.utils.MusicServiceConnectionUtils.bindToService(SourceFile:36)
at com.simplecity.amp_library.ui.activities.BaseActivity.bindService(SourceFile:129)
at com.simplecity.amp_library.ui.activities.BaseActivity.onResume(SourceFile:96)
Run Code Online (Sandbox Code Playgroud)
在调用onResume()(和super.onResume())之后,我的应用程序是如何处于后台的?
这对我没有任何意义.这可能是一个平台错误吗?受此次崩溃影响的所有3500多名用户都在Android P.
如何在一段时间间隔之后重复执行异步任务,就像Timer一样...实际上我正在开发一个应用程序,它会自动从服务器下载所有最新的未读问候语,为此我必须在修复后检查服务器的更新时间间隔....我知道可以通过计时器轻松完成,但我想使用异步任务,我认为对Android应用程序更有效.
我正在编写一个Android 1.5应用程序,它在启动后启动.这是一个Service,应该拍照没有预览.此应用程序将记录某些区域的光密度.我能够拍照,但照片是黑色的.
经过长时间的研究,我遇到了一个关于它的bug线程.如果您不生成预览,则图像将为黑色,因为Android相机需要预览才能设置曝光和对焦.我创建了一个SurfaceView和听众,但onSurfaceCreated()事件永远不会被解雇.
我想原因是,表面没有在视觉上创造.我还看到了静态调用相机的一些例子,MediaStore.CAPTURE_OR_SOMETHING它们拍摄照片并用两行代码保存在所需的文件夹中,但它也没有拍照.
我是否需要使用IPC并bindService()调用此功能?或者是否有另一种方法来实现这一目标?
当我注意到两个相互矛盾的观点时,我正在浏览android中的服务文档:
在服务文档中,它在" 管理服务的生命周期"中指定
这两条路径并不完全分开.也就是说,您可以绑定到已使用startService()启动的服务.例如,可以通过使用标识要播放的音乐的Intent调用startService()来启动背景音乐服务.之后,可能当用户想要对播放器进行一些控制或获取有关当前歌曲的信息时,活动可以通过调用bindService()绑定到服务.在这种情况下,stopService()或stopSelf()实际上不会停止服务,直到所有客户端解除绑定.
但是在关于管理绑定服务的生命周期中的绑定服务的文档中
但是,如果您选择实现onStartCommand()回调方法,则必须显式停止该服务,因为现在认为该服务已启动.在这种情况下,服务一直运行,直到服务使用stopSelf()或其他组件调用stopService()停止自身,无论它是否绑定到任何客户端.
可能是我,但我认为这些陈述是矛盾的.有人可以澄清......
我的应用程序使用一种模式,我使用Context#startService()启动服务,并使用Context#bindService()绑定它.这样我就可以独立于任何客户端当前是否绑定它来控制服务的生命周期.但是,我最近注意到,每当我的应用程序被系统杀死时,它很快就会重新启动所有正在运行的服务.此时,服务永远不会被告知停止,这会导致电池耗尽.这是一个最小的例子:
我在这里找到了一个有类似问题的人,但它从未被诊断或解决过.
服务:
@Override
public void onCreate() {
Toast.makeText(this, "onCreate", Toast.LENGTH_LONG).show();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return new Binder();
}
Run Code Online (Sandbox Code Playgroud)
活动:
@Override
protected void onStart() {
super.onStart();
Intent service = new Intent(this, BoundService.class);
startService(service);
bindService(service, mServiceConnection, 0);
}
@Override
protected void onStop() {
unbindService(mServiceConnection);
Toast.makeText(this, "unbindService", Toast.LENGTH_SHORT).show();
super.onStop();
}
Run Code Online (Sandbox Code Playgroud)
为了测试它,我启动了应用程序,它启动了服务并绑定到它.然后我退出了应用程序,解除绑定(但让服务运行).然后我做了
$ adb shell am kill com.tavianator.servicerestart
Run Code Online (Sandbox Code Playgroud)
果然,5秒钟后,"onCreate"吐司出现,表明该服务再次启动.Logcat显示了这个:
$ adb …Run Code Online (Sandbox Code Playgroud) android上的Activity的生命周期图并不保证会调用onDestroy(),但是可能会终止该进程并突然删除Activity.android上的服务的生命周期图确保了将调用onDestroy().所以我有两个与这种差异有关的问题.
首先,如果Service是与Activity相同的进程的一部分,是否调用了Service onDestroy(),虽然没有调用Activity onDestroy()?我不这么认为,因为"杀死进程"表明操作系统正在停止其线程并释放其资源.
如果是这样的话,操作系统是否会突然杀死仅服务进程?
我有一点问题.
在我的应用程序中,在用户成功登录后启动服务.以前,如果应用程序被杀,该服务需要停止.(比如,通过滑动从最近的应用程序列表中删除.)所以我们使用过android:stopWithTask="true".现在我们需要服务按原样运行,即使启动它的任务从最近的应用程序列表中删除.所以我把服务改为包含android:stopWithTask="false".但这似乎不起作用.
相关代码:
这是与服务相关的明显部分:
<service
android:enabled="true"
android:name=".MyService"
android:exported="false"
android:stopWithTask="false" />
Run Code Online (Sandbox Code Playgroud)
在MyService.java中:
public class MyService extends AbstractService {
@Override
public void onStartService() {
Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
Notification notification = new Notification(R.drawable.ic_launcher, "My network services", System.currentTimeMillis());
notification.setLatestEventInfo(this, "AppName", "Message", pendingIntent);
startForeground(MY_NOTIFICATION_ID, notification);
}
@Override
public void onTaskRemoved(Intent rootIntent) {
Toast.makeText(getApplicationContext(), "onTaskRemoved called", Toast.LENGTH_LONG).show();
System.out.println("onTaskRemoved called");
super.onTaskRemoved(rootIntent);
}
}
Run Code Online (Sandbox Code Playgroud)
AbstractService.java是扩展的自定义类Sevrice:
public abstract class …Run Code Online (Sandbox Code Playgroud) 我正在尝试为Android创建自己的MusicPlayer.我遇到问题的地方是在后台运行一些东西.主要活动管理GUI,到目前为止所有的歌曲都在播放.我想分开GUI和音乐播放课程.我想把音乐管理部分放在服务中,并留下现在的其他东西.
我的问题是我无法组织活动和服务之间的沟通,因为它们之间正在进行大量的沟通,包括双向移动物体.我尝试了很多技术,我在这里搜索Stack Overflow但每次遇到问题时都会这样做.我需要Service才能将对象发送到Activity,反之亦然.当我添加小部件时,我也希望它能够与服务进行通信.
任何提示都很受欢迎,如果你需要源代码发表评论,但现在在这个转变中它变得混乱.
是否有更高级的教程,而不是调用一个从服务返回随机数的方法?:P
编辑:可能的解决方案是使用RoboGuice库并注入移动对象