我正在搞乱Android服务,而且我发现ServiceConnection.onServiceConnected()当我绑定到服务时,可以相当可预测地调用它.
但是,onServiceDisconnected()即使在VM死后,我的方法似乎永远不会被调用.
我已经在服务上记录了调试消息并显示所有线程都已关闭等等.我知道服务是作为进程实现的.是否有我不知道的线程阻止进程退出?
此代码将在启动系统后自动运行应用程序,但按下后退按钮后应用程序将关闭.
如果应用程序通过单击它的图标正常运行.即使按下后退按钮或运行其他应用程序,它也会继续运行.
public class AutoBoot extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, MyActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,即使在按下后退按钮或运行其他应用程序后,如何使此自动运行代码继续运行?
我在我的Ubuntu VM中运行了Android Emulator,并通过控制台安装了一个apk文件.模拟器和adb有很多选项可以查看设备上发生的情况.但是,如何获取当前正在运行的服务列表?我正在尝试查看特定应用是否安装了通知服务以查看(不需要的)广告.我甚至知道服务的名称.
PS.:我是一名高级初学者 - 但还不够先进.谢谢你的帮助.
我有一个应用程序,它基本上是一个一直运行的服务,并在发生事件时向用户发出警报.
当服务创建警报时,它需要将其发送给警报,context以便警报可以在发生事件时对服务进行回调.
例如:
public MyService extends Service{
private SomeAlarm alarm;
@Override
public void onCreate() {
super.onCreate();
alarm = new SomeAlarm(MyService.this);
}
}
Run Code Online (Sandbox Code Playgroud)
如何将SomeAlarm类注入服务,并将SomeAlarm服务上下文作为变量?
android dependency-injection inversion-of-control android-service dagger-2
我正在尝试创建一个允许用户记录路线(位置/ GPS)的应用程序.为了确保即使屏幕关闭也会记录位置,我已经foreground service为位置记录创建了一个.我将位置存储在一个Room Database注入我的服务中的位置Dagger2.
但是,这项服务被Android杀死,当然这并不好.我可以订阅低内存警告,但这并没有解决我的服务在运行Android 8.0的现代高端手机上大约30分钟后被杀的根本问题
我创建了一个只有"Hello world"活动和服务的最小项目:https://github.com/RandomStuffAndCode/AndroidForegroundService
该服务在我的Application课程中启动,路由记录通过以下方式启动Binder:
// Application
@Override
public void onCreate() {
super.onCreate();
mComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
Intent startBackgroundIntent = new Intent();
startBackgroundIntent.setClass(this, LocationService.class);
startService(startBackgroundIntent);
}
// Binding activity
bindService(new Intent(this, LocationService.class), mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT);
// mConnection starts the route logging through `Binder` once connected. The binder calls startForeground()
Run Code Online (Sandbox Code Playgroud)
我可能不需要BIND_AUTO_CREATE旗帜,我一直在测试不同的旗帜,试图不让我的服务被杀 - 到目前为止没有运气.
使用分析器看起来我没有任何内存泄漏,内存使用率稳定在~35mb:
使用adb shell dumpsys activity …
android android-service android-location android-lifecycle android-doze
我正在编写一个与RESTful服务接口的Android应用程序.此Web服务基本上是文件系统的前端,并提供元数据以及对文件的CRUD访问.我的应用程序检索元数据,并通过a将其公开给第三方应用程序ContentProvider.
我需要添加第三方应用程序的能力,在与我的应用程序相同的设备上运行,通过向我的应用程序发送请求(而不是直接与服务器)来CRUD实际文件.这意味着他们需要通过我的应用程序发送或接收文件的内容(通常是XML或图像).
我想到了实现这个的两种方法:
这似乎是让第三方应用程序能够从我的文件中读取文件的明显选择ContentProvider.我认为当这些应用程序需要通过我的`ContentProvider'创建或更新文件时,它开始变得棘手.完成后我需要回调才能知道何时将新的/更改的文件发送回服务器.我相信我可以为此目的使用FileObserver.
通过这种方法,我可以通过应用程序和客户端应用程序之间的文件发送Messenger.该文件必须通过一个传递Bundle,所以我不知道什么是最好的格式是发送它们(File,FileDescriptor,字节数组,别的东西?).如果文件变得很大,我不能很好地处理这会导致问题.
Messenger/ 传递CRUD请求和删除框内容ServiceContentProvider来存储请求的状态ContentObserver我认为使用ContentProvider将是理想的解决方案,但似乎API并不完全支持我的用例.我担心尝试沿着这条路走下去可能会导致一个愚蠢的实施.如果我采用Messenger和Service接近,我不确定通过a传输文件的最强大的方法Bundle.
混合方法似乎非常强大,但实现起来最复杂.文件实际上并没有被传递,因此性能应该很好.但是,我担心这会过度设计解决方案.
在同一Android设备上运行的应用程序之间传输文件的最佳方法是什么? 当然,我对我在问题中没有概述的其他选项持开放态度.
我希望能够在SIM状态改变时做一些事情,即在需要SIM PIN时播放声音,但我认为没有广播事件可以被广播接收器截获...注册android.intent.action .PHONE_STATE只会告诉你CALL-STATE何时发生变化.另一种方法是启动一个注册PhoneStateListener的服务并对LISTEN_SERVICE_STATE作出反应(当状态为OUT-OF-STATE时它可以获取SIM从TelephonyManager状态并查看状态是否为SIM_STATE_PIN_REQUIRED).所以,我的问题是:
1)是否有任何广播意图可用于拦截SIM状态变更或服务状态变更?
2)在ServiceStateListener接收到电话状态改变的通知后,在服务中安装PhoneStateListener并使用它向服务本身传递意图是一个坏主意吗?
我正在开发一款能够持续保持与互联网连接的Android应用.如果Internet是dow,它应该向用户发出适当的消息.
有没有像Internet Listener这样的东西?或者如何实现此事件,每当Internet连接不可用时,它应该提供警报.
我在下面给出的代码中得到了这个异常.我不知道这段代码有什么问题.请帮我摆脱这个例外.
05-23 23:33:49.853: E/BroadcastReceiver(26895): BroadcastReceiver trying to return result during a non-ordered broadcast
05-23 23:33:49.853: E/BroadcastReceiver(26895): java.lang.RuntimeException: BroadcastReceiver trying to return result during a non-ordered broadcast
05-23 23:33:49.853: E/BroadcastReceiver(26895): at android.content.BroadcastReceiver.checkSynchronousHint(BroadcastReceiver.java:783)
05-23 23:33:49.853: E/BroadcastReceiver(26895): at android.content.BroadcastReceiver.setResultCode(BroadcastReceiver.java:549)
05-23 23:33:49.853: E/BroadcastReceiver(26895): at com.waypedia.rupesh.abhi.RetentionApplicationAddedBroadcastReceiver.onReceive(RetentionApplicationAddedBroadcastReceiver.java:18)
05-23 23:33:49.853: E/BroadcastReceiver(26895): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2446)
05-23 23:33:49.853: E/BroadcastReceiver(26895): at android.app.ActivityThread.access$1700(ActivityThread.java:139)
05-23 23:33:49.853: E/BroadcastReceiver(26895): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1286)
05-23 23:33:49.853: E/BroadcastReceiver(26895): at android.os.Handler.dispatchMessage(Handler.java:102)
05-23 23:33:49.853: E/BroadcastReceiver(26895): at android.os.Looper.loop(Looper.java:136)
05-23 23:33:49.853: E/BroadcastReceiver(26895): at android.app.ActivityThread.main(ActivityThread.java:5102)
05-23 23:33:49.853: E/BroadcastReceiver(26895): at java.lang.reflect.Method.invokeNative(Native Method)
05-23 23:33:49.853: E/BroadcastReceiver(26895): …Run Code Online (Sandbox Code Playgroud) android intentfilter broadcastreceiver android-intent android-service
我想安排每晚数据库更新.所以我使用新的Android WorkManager.我的理解是,一旦安排它将始终独立于应用程序的生命周期在后台运行.是对的吗?我的第一次测试显示Work只在应用程序运行时执行.
val locationWork = PeriodicWorkRequest.Builder(UpdateDatabaseWorker::class.java, 24, TimeUnit.HOURS)
.addTag("DATABASE_UPDATE_SERVICE")
.build()
WorkManager.getInstance().enqueue(locationWork)
Run Code Online (Sandbox Code Playgroud) android ×10
android-service ×10
android-doze ×1
dagger-2 ×1
intentfilter ×1
ipc ×1
java ×1
monitor ×1
monitoring ×1
networking ×1