我写了两个应用程序(目标姜饼).让我们说app1和app2.App1有两个以"BOOT_COMPLETED"开头的服务,它们以返回值START_STICKY开头.它们在不同的线程中运行.使长话短说.其中一项服务是监视串行端口上的传入数据(一种代理,用于与串行端口另一端的接口通信的应用程序).另一个让听众观看一些系统状态并等待来自其他应用程序的一些"指令".我知道它们运行良好,因为它们列在正在运行的服务中,并且我添加了一些代码,当某些特定数据来自串行端口时,它会强制它们执行某些操作.
现在的问题是:我写了app2.它尝试绑定到app1中的某个服务.我使用了android-developper文档,并在app1和app2中的服务之间实现了双向通信.由于我只需要发送少量非常简单的数据,因此我建议使用信使.我基本上只使用"what,arg1和arg2"我没有使用AIDL接口,因为文档建议.
这是androidmanifest在app1中声明服务的部分我也尝试绑定.
<service android:name=".ModemWatcherService"
android:label="@string/app_name"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<!-- Service name -->
<action android:name="com.admetric.modemwatcher.Service" />
</intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)
然后,以下是在app1中处理此问题的几种方法:
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "entering onBind");
return mMessenger.getBinder();
}
/**
* Handler of incoming messages from clients.
*/
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
String logMessage = "Received meaasge what= %d, arg1= %d, arg2= %d" + String.valueOf(msg.what) + String.valueOf(msg.arg1) + String.valueOf( msg.arg2);
Log.d(TAG, logMessage);
switch (msg.what) …Run Code Online (Sandbox Code Playgroud) 我有一个绑定服务,负责下载文件,因此它知道下载状态/进度.UI(片段或活动)必须显示/更新服务的下载进度.
实际上我认为常用的方法是使用BroadcastReciever或CallBack来自Activity.但我听说过使用RxJava(ReactiveX编程)和中介类(以及Dagger将其注入服务和活动),如下所述.
所以我的问题是如何使用这些东西来处理RxJava?任何代码示例?有没有比使用意图更有效的方法?
资源: 从Service更新UI的有效方式比意图更新?[见第一个答案更新]
我们最近将主要的Application类转换为Kotlin.
从那时起,我们遇到了崩溃,特别是在夜间(当我们的应用程序可能被系统杀死时),当我们的JobService是startet时.
我们以静态方式访问应用程序上下文以获取某些依赖项,这些依赖项在将类转换为Kotlin之前运行良好.从那以后,静态getter是lateinit var在应用程序onCreate函数中初始化的.
发布后Google Play报告了这些崩溃:
Caused by: kotlin.UninitializedPropertyAccessException:
at x.y.z.application.App.access$getAppContext$cp
[...]
at x.y.z.jobs.JobSchedulerService.onCreate (JobSchedulerService.java:27)
Run Code Online (Sandbox Code Playgroud)
这导致了问题,我们还Application.onCreate()没有执行?
我们稍微重构了JobService,以减少静态上下文访问量,直到需要进行大量重构.之后,我们在Google Play控制台中收到了用户的这些崩溃消息:
Caused by: kotlin.UninitializedPropertyAccessException:
at org.koin.standalone.StandAloneContext.getKoinContext (StandAloneContext.java:45)
at org.koin.java.standalone.KoinJavaComponent.get (KoinJavaComponent.java:66)
at org.koin.java.standalone.KoinJavaComponent.get$default (KoinJavaComponent.java:64)
at org.koin.java.standalone.KoinJavaComponent.get (KoinJavaComponent.java)
at x.y.z.SearchState.<init> (SearchState.java:21)
[...]
at x.y.z.jobs.JobSchedulerService.onStartJob (JobSchedulerService.java:54)
Run Code Online (Sandbox Code Playgroud)
这些崩溃告诉我们同样的事情:Application.onCreate()由于Koin没有初始化,因此尚未执行.
那我的问题呢?Application.onCreate()转换到Kotlin时为什么要执行更改时间?为什么在JobService启动之前我们的应用程序不再创建?
我的意思是,当然,我们可以重构整个应用程序依赖项以使用JobService本身提供的上下文,但是如果应用程序是在之后创建的并且我们仍然想要使用Koin呢?我们的应用程序可能会再次崩溃AlreadyStartetException.如果我们的应用程序尚未"存在",那么该服务将具有哪些上下文?
应用
abstract class App : MultiDexApplication() {
companion object {
@JvmStatic
lateinit var appContext: Context
@JvmStatic
val isDevelopment: Boolean = BuildConfig.DEBUG
// @JvmStatic
// …Run Code Online (Sandbox Code Playgroud) 我最近编写了一个Android Widget并在模拟器和我的Galaxy S上进行了测试,它在两者上都运行良好,在我发布到Android市场后,我现在收到一些错误报告.
我在Widget类的onUpdate中声明了一个服务,如下所示:
if (appWidgetIds != null) {
final int N = appWidgetIds.length;
// Perform this loop procedure for each App Widget that belongs to
// this
// provider
for (int i = 0; i < N; i++) {
// Start Service for each instance
int appWidgetId = appWidgetIds[i];
Intent active = new Intent(context, DialerService.class);
active.setAction("Start");
active.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
appWidgetId);
context.startService(active);
}
}
Run Code Online (Sandbox Code Playgroud)
有些人得到的错误是:
java.lang.RuntimeException: Unable to start service dialer.impact.DialerService@45f926f0 with null: java.lang.NullPointerException
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3282)
at android.app.ActivityThread.access$3600(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2211)
at android.os.Handler.dispatchMessage(Handler.java:99) …Run Code Online (Sandbox Code Playgroud) 我对Android比较陌生,所以我要问的可能看起来很明显(虽然我已经阅读了所有类似标题的问题,并且进行了广泛的搜索).我需要长时间连续监控加速度计.提出了两种方法:
1)获取部分唤醒锁定,该锁定在整个加速器被监视的时间内保持; 和
2)在前台服务中监控加速度计.
第一种方法似乎使用了大量的电池寿命.第二种方法应该导致服务很少被杀死,但我不确定"很少"意味着什么.应该使用哪种方法,还有哪些方法我应该考虑?
我是Android编程的新手,因此我在选择设计应用程序的最佳方式时遇到了一些常见问题.
我想做的基本上是媒体播放器.我希望媒体播放器能够在服务上运行,因为我希望它也可以在未显示活动时播放.
我的问题是,如何根据服务工作流程更新我的活动用户界面(例如,歌曲更改,我想要显示其名称)?
我想我可以使用本地广播管理器将我的服务中的意图发送到我的活动并调用UI更新(它看起来是否正确?)
但是......我希望我的服务在播放音乐时做一些事情(比如查询/更新数据库).出于这个原因,我在考虑在不同的进程(或线程?)上运行服务.
所以..我猜,在不同的进程上运行服务,我将无法使用本地广播管理器(这是对的吗?).
我希望我解释了我的疑虑......任何人都可以帮忙吗?
非常感谢!
我正在制作一个应用程序,允许用户拍照并通过电子邮件自动发送到他选择的电子邮件.到目前为止,我能够拍照并存储在SD卡中.现在我只需要从文件夹(/ sdcard/Pictures/PhotoSender /)获取图片的功能,并自动发送到用户请求的电子邮件.我怎样才能做到这一点?
我在那个文件夹中有图片.我只需要一些函数来生成电子邮件,将图片(.jpg)作为附件发送(所有这些都在背景上).当电子邮件完全发送时,应该弹出一个"上传完成"的Toast.同时用户应该可以自由拍摄更多照片,因此上传请求应该放在队列中.用户不应使用他的电子邮件帐户登录发送.如果需要,我可以为我的应用创建一个电子邮件帐户作为"发件人".请帮我!
email android email-attachments android-intent android-service
我已经创建了一个服务来定期获取设备的当前位置.即使从最近打开的应用程序中清除了应用程序,我也希望该服务在后台运行.目前,该服务仅在后台运行,直到应用程序出现在最近打开的应用程序中,但在应用程序被刷掉(或以其他方式杀死)时立即停止.我已经尝试过堆栈溢出中的各种帮助,但我无法解决这个问题.请帮忙.这是我的服务代码.
package com.packr.services;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ServiceInfo;
import android.location.Location;
import android.os.Bundle;
import android.os.IBinder;
import android.os.SystemClock;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import java.text.DateFormat;
import java.util.Date;
/**
* Created by Arindam on 11-Dec-15.
*/
public class LocationService extends Service implements
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
protected static final String TAG = "packrMATE";
/**
* The desired interval for location updates. Inexact. Updates may be …Run Code Online (Sandbox Code Playgroud) android restart background-service android-service android-service-binding
首先,我看了看这些;
我有将近一百万人使用的流应用程序。我正在为播放器使用前台服务。我还没有实现MediaSession。我有99.95%的无崩溃会话。因此,该应用程序适用于所有版本,但我开始使用Android 9获取崩溃报告(ANR)。此崩溃仅发生在Samsung手机上,尤其是s9, s9+, s10, s10+, note9型号。
我尝试过这些
startForeground()方法onCreate()Service.startForeground()之前致电Context.stopService()我阅读了Google开发人员的一些评论,他们说这仅仅是Intended Behavior。我想知道这是由三星的系统还是Android操作系统引起的。有人对此有意见吗?我怎样才能解决这个问题?
android ×10
android-service ×10
binding ×1
email ×1
koin ×1
kotlin ×1
performance ×1
restart ×1
rx-android ×1
rx-java ×1
ui-thread ×1