标签: android-service

什么时候调用ServiceConnection.onServiceDisconnected()?

我正在搞乱Android服务,而且我发现ServiceConnection.onServiceConnected()当我绑定到服务时,可以相当可预测地调用它.

但是,onServiceDisconnected()即使在VM死后,我的方法似乎永远不会被调用.

我已经在服务上记录了调试消息并显示所有线程都已关闭等等.我知道服务是作为进程实现的.是否有我不知道的线程阻止进程退出?

android android-service

26
推荐指数
1
解决办法
8297
查看次数

如何在后台运行Android应用程序?

此代码将在启动系统后自动运行应用程序,但按下后退按钮后应用程序将关闭.

如果应用程序通过单击它的图标正常运行.即使按下后退按钮或运行其他应用程序,它也会继续运行.

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)

我的问题是,即使在按下后退按钮或运行其他应用程序后,如何使此自动运行代码继续运行?

android android-service

26
推荐指数
2
解决办法
10万
查看次数

Android Emulator:如何获取正在运行的服务列表

我在我的Ubuntu VM中运行了Android Emulator,并通过控制台安装了一个apk文件.模拟器和adb有很多选项可以查看设备上发生的情况.但是,如何获取当前正在运行的服务列表?我正在尝试查看特定应用是否安装了通知服务以查看(不需要的)广告.我甚至知道服务的名称.

PS.:我是一名高级初学者 - 但还不够先进.谢谢你的帮助.

monitoring android monitor android-emulator android-service

26
推荐指数
2
解决办法
3万
查看次数

使用Dagger 2注入服务

我有一个应用程序,它基本上是一个一直运行的服务,并在发生事件时向用户发出警报.

当服务创建警报时,它需要将其发送给警报,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

26
推荐指数
2
解决办法
2万
查看次数

最小的Android前台服务在高端手机上被杀死

我正在尝试创建一个允许用户记录路线(位置/ 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

26
推荐指数
2
解决办法
8112
查看次数

如何在同一设备上运行的Android应用程序之间传输文件?

我正在编写一个与RESTful服务接口的Android应用程序.此Web服务基本上是文件系统的前端,并提供元数据以及对文件的CRUD访问.我的应用程序检索元数据,并通过a将其公开给第三方应用程序ContentProvider.

我需要添加第三方应用程序的能力,在与我的应用程序相同的设备上运行,通过向我的应用程序发送请求(而不是直接与服务器)来CRUD实际文件.这意味着他们需要通过我的应用程序发送或接收文件的内容(通常是XML或图像).

我想到了实现这个的两种方法:

选项1 - 使用ContentProvider.openFile

这似乎是让第三方应用程序能够从我的文件中读取文件的明显选择ContentProvider.我认为当这些应用程序需要通过我的`ContentProvider'创建或更新文件时,它开始变得棘手.完成后我需要回调才能知道何时将新的/更改的文件发送回服务器.我相信我可以为此目的使用FileObserver.

选项2 - 通过服务使用Messenger

通过这种方法,我可以通过应用程序和客户端应用程序之间的文件发送Messenger.该文件必须通过一个传递Bundle,所以我不知道什么是最好的格式是发送它们(File,FileDescriptor,字节数组,别的东西?).如果文件变得很大,我不能很好地处理这会导致问题.

选项3 - 混合方法

  1. 将外部存储上的文件夹用作下拉框
  2. 通过Messenger/ 传递CRUD请求和删除框内容Service
  3. 使用它ContentProvider来存储请求的状态
  4. 第三方应用通过a接收状态更新 ContentObserver

摘要

我认为使用ContentProvider将是理想的解决方案,但似乎API并不完全支持我的用例.我担心尝试沿着这条路走下去可能会导致一个愚蠢的实施.如果我采用MessengerService接近,我不确定通过a传输文件的最强大的方法Bundle.

混合方法似乎非常强大,但实现起来最复杂.文件实际上并没有被传递,因此性能应该很好.但是,我担心这会过度设计解决方案.

在同一Android设备上运行的应用程序之间传输文件的最佳方法是什么? 当然,我对我在问题中没有概述的其他选项持开放态度.

android ipc android-service android-contentprovider

25
推荐指数
1
解决办法
4549
查看次数

如何监控SIM状态变化

我希望能够在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 broadcastreceiver android-service telephonymanager

25
推荐指数
2
解决办法
3万
查看次数

互联网监听器Android示例

我正在开发一款能够持续保持与互联网连接的Android应用.如果Internet是dow,它应该向用户发出适当的消息.

有没有像Internet Listener这样的东西?或者如何实现此事件,每当Internet连接不可用时,它应该提供警报.

java networking android android-intent android-service

25
推荐指数
2
解决办法
3万
查看次数

BroadcastReceiver尝试在非有序广播期间返回结果 - 在Android中使用PACKAGE_ADDED

我在下面给出的代码中得到了这个异常.我不知道这段代码有什么问题.请帮我摆脱这个例外.

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

25
推荐指数
1
解决办法
2万
查看次数

Android系统.应用程序关闭时WorkManager是否正在运行?

我想安排每晚数据库更新.所以我使用新的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 android-service android-jetpack android-workmanager

25
推荐指数
2
解决办法
2万
查看次数