Articles of 服务

考虑到电池,Android在后台重复获取位置的最佳方式

我需要在我的应用程序中连续请求位置,它应该始终是后台服务。 我需要每两分钟左右拉一次。 我想过使用一个服务,在onStartCommand我会使用locationmanager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_INTERVAL, MINIMUM_DISTANCE, this); 以及locationmanager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MINIMUM_TIME_INTERVAL, MINIMUM_DISTANCE, this); 但我担心随着时间的推移,这个requestLocationUpdates会停止给我一个位置。 所以我想到使用AlarmManager所以它继续给我位置。 我的问题是,是否有必要使用AlarmManager提醒获取位置,或者如果我使用AlarmManager将耗尽大量电池。 我只是想知道在后台获取位置的最佳方法。 提前致谢。

Android服务onCreate被多次调用而不调用onDestroy

在我的应用程序中,我使用服务与我们的服务器进行通信。 该服务生成多个消息队列线程来处理具有不同优先级的任务。 这个模型已经使用了大约一年没有大问题。 但是,最近,我发现我的服务类的onCreate被多次调用了一段时间。 在两个onCreate调用之间永远不会调用onDestroy 。 因此,我没有机会杀死现有的线程。 一旦发生此行为,服务内部就会出现重复的线程。 我唯一改变的是运行服务,因为前台服务是用户登录应用程序。 我想知道前台服务是否会导致问题。 有任何想法吗?

如何检查android中的所有运行服务?

我想访问并查看后台运行的服务数量和服务。 我想要与我们可以访问的完全相同的function 菜单 – >设置 – >应用程序 – >运行服务 在我们的Android基础手机或标签上。 任何人都可以告诉我在Android源代码中使用了哪些函数或类来提供此function。 如果有任何方法我可以访问我上面提到的后台运行服务的内置列表,那么请告诉我,因为它更适合我使用in-build one而不是创建全新的。

在活动可见时隐藏前台服务的通知

他们是一种将服务作为前台服务启动并在活动可见时隐藏通知的方法吗? 考虑一个音乐播放器,当应用程序打开时,您不需要通知(即按钮),但只要音乐播放器在后台,就会显示通知。 我知道,怎么做,如果我不在前台运行我的服务…但是当在前台运行时,服务本身需要通知并显示它,我自己无法管理通知… 我该如何解决这个问题?

当手机不使用时,AlarmManager重复警报随机丢失

我以30分钟的间隔调用后台Service来读取当前位置的纬度/经度并通过POST API将其发送到服务器。 我使用setRepeating()类的setRepeating()方法每30分钟安排一次警报。 但有时警报会被遗漏而服务没有被调用。 为了监控是否每30分钟调用一次警报,我在SD卡中生成了Log.txt文件。 对于每次报警当前时间的报警都将写入Log.txt文件中。 但是在比较了4到5个设备的Log.txt文件后,我注意到对于某些设备,警报没有调用UserTrackingReceiver.java (后台服务)的onCreate()方法。 下面提到的完整代码块。 当app启动registerUserTrackingReceiver()方法时,调用如下: public static void registerUserTrackingReceiver(Context context) { try { Intent intent = new Intent(context, UserTrackingReceiver.class); boolean alarmUp = (PendingIntent.getService(context, 1001, intent, PendingIntent.FLAG_NO_CREATE) == null); if (alarmUp) { Calendar calendar = Calendar.getInstance(); if (calendar.get(Calendar.MINUTE) > 0 && calendar.get(Calendar.MINUTE) 30) { if (calendar.get(Calendar.HOUR_OF_DAY) == 23) { calendar.set(Calendar.HOUR_OF_DAY, 0); […]

每天创建通知

我想在每天上午8:00创建通知。 我在SQLite数据库中有一些数据,此时我每天都想从中获取数据并从中创建通知。 创建新通知没有问题,但我现在每天如何显示它? 我想我必须使用服务但是如何告诉系统在特殊时刻启动此服务? 我应该使用什么样的服务? 我想如果系统调用该服务,它会启动一个特定的function,我可以运行我的代码连接到数据库并创建并将我的通知发送到系统吗? 我无法理解的是,如果我在我的主Activity中注册该服务,为什么系统会在用户关闭我的应用程序时启动服务? 任何人都可以向我解释一下吗? 我总是认为如果我的主要活动被破坏,服务也会被破坏。

阻止某些用户关闭Android服务

我正在Android上提供服务,它将安装在手机/平板电脑上。 许多人可以使用该平板电脑,但只有选定的平板电脑应该有权关闭该服务。 我怎样才能做到这一点? 我用Google搜索并find了一些选项: 创建用户帐户:有很多应用程序,但他们没有指定在一个帐户中运行的服务是否也会运行其他帐户。 在关闭服务之前提示输入密码:有许多stackoverflow Q.for this但看起来不可能。 用户关闭服务时重新启动服务:由于我的服务不断与其他设备通信以收集数据,因此重新启动可能会导致数据丢失。 新选择: 我有另一个想法让它工作:我将使它成为系统应用程序,以便当他试图阻止它时它会警告用户。 对于系统应用程序,当用户从设置中按下“停止”按钮时,会popup一条警告消息:“关闭此应用程序可能会导致…(等等等等)……”。 你知道popup这条消息会引起什么意图吗? 我想我可以在这里使用这个意图并禁用此消息中的“确定”选项 。

无法检查AlarmManager是否设置了警报

我正在检查AlarmManager是否已使用此答案设置了警报。 以下是我的代码段。 boolean alarmUp = (PendingIntent.getBroadcast(MainActivity.this, 0, new Intent(MainActivity.this, AlarmReceiver.class), PendingIntent.FLAG_NO_CREATE) != null); if (alarmUp) { // alarm is set; do some stuff } Intent alarmIntent = new Intent(MainActivity.this, AlarmReceiver.class); final PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10 * 1000, pendingIntent); 但是, alarmUp始终设置为true。 也就是说,无论我是否设置闹钟,每当我重新启动我的应用时,它都会告诉我alarmUp是真的(我正在通过制作Toast检查它)。 请帮助我出错的地方。

如何在被“高级任务杀手”等应用程序杀死后重启服务?

我有一个“扩展服务”的公共类,这个服务是使用startService(…)从一个活动启动的。 但在我使用高级任务杀手之后 ,该服务被终止并且再也没有重新启动。 我注意到一些应用程序,比如Facebook Messenger Android应用程序,即使在从高级任务杀手杀死它们后也会自动重启… facebook / twitter应用程序是如何做到的?

处理Lollipop中隐含意图的未来弃用

要将数据传输到其他应用程序,我一直在使用隐式意图,如下例所示: Intent intent = new Intent(); intent.setAction(“com.example.OpenURL”); intent.putExtra(“URL_TO_OPEN”, url_string); sendOrderedBroadcastAsUser(intent); Intent intent = new Intent(); intent.setAction(“com.example.CreateUser”); intent.putExtra(“Username”, uname_string); intent.putExtra(“Password”, pw_string); sendBroadcast(intent); Intent intent = new Intent(); intent.setAction(“com.example.BackupUserData”); intent.setData(file_uri); intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION); sendBroadcast(intent); 但是在Android 5.0中不再推荐这种行为 http://developer.android.com/about/versions/android-5.0-changes.html 绑定到服务 Context.bindService()方法现在需要显式的Intent,如果给定隐式intent,则抛出exception。 要确保您的应用程序是安全的,请在启动或绑定服务时使用明确的意图,并且不要为服务声明意图filter。 从android源代码更准确地说是“ContextImpl”类: private void validateServiceIntent(Intent service) { if (service.getComponent() == null && service.getPackage() == null) { if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP) […]