Articles of android service

持久的服务

我知道有些人认为你不应该创建持久性服务。 但对于我们这些想要增加知识的人来说,如何在理论上创造一个呢? 我一直在玩,并注意到在低内存情况下使用startForeground的服务会被杀死。 我已经看到了一个现在被弃用的权限PERSISTENT_ACTIVITY ,但这并没有做太多。 那么秘密是什么?

无法使用null启动服务

我最近编写了一个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, […]

如何从服务检查应用程序在前台?

只有当应用程序不在前台时,我才需要向用户显示通知。 这是我的公共类MyFirebaseMessagingService扩展 FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { if(applicationInForeground()) { Map data = remoteMessage.getData(); sendNotification(data.get(“title”), data.get(“detail”)); } } 需要实现applicationInForeground()方法

永远不会启动Android服务 – 未调用onStartCommand()

我正在尝试创建一个将在后台处理文件I / O的服务。 更新数据的活动将绑定到服务并调用服务的方法来执行I / O. 我正在使用Android文档获取指导。 但是,我的服务似乎并不想开始。 在我的Activity的onCreate()方法中,我有: Intent smsIntent = new Intent(this, SurveyManagerService.class); String surveyFilename = getIntent().getStringExtra(“surveyFilename”); System.out.println(startService(smsIntent)); //testing if it starts SurveyManagerServiceConnection connection = new SurveyManagerServiceConnection(); sms = connection.getSurveyManagerService(); 在第3行,LogCat输出一个ComponentInfo对象,因此看起来服务已经创建; 但是,短信是空的。 此外,似乎永远不会调用SurveyManagerService onStartCommand()方法: @Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println(“starting service”); Toast.makeText(this, “service starting”, Toast.LENGTH_SHORT).show(); openSurveyFromIntent(intent); return START_REDELIVER_INTENT; […]

如何在Android中的服务中运行CountDownTimer?

我想要一个运行CountDownTimer的服务,并且在每个tick中我想要在Activity中显示倒计时,并在一段时间后发出声音。 所有过程都在单个活动中正常运行但在来电期间倒计时不起作用,这就是我想使用服务执行此操作的原因。 有谁能够帮助我? 提前致谢。 更新中… mCountDownTimer = new CountDownTimer(mTimerDuration, 1000) { @Override public void onTick(long millisUntilFinished) { if (mTimerDuration > 0) { mDurationCount += 1000; showCountDown( ActivityA.this, (mSimpleDateFormat.format(mTimerDuration – mDurationCount))); if (mDurationCount == mTimerDuration) { if (mRepeatTime > 1) { startRepeatTimer(); } finishTimer(); } } } @Override public void onFinish() { } }.start();

防止Android服务的多个副本

startService的doco声明“如果此服务尚未运行,它将被实例化并启动(如果需要,为它创建一个进程);如果它正在运行,那么它仍然在运行。” 我发现每次调用startService似乎都是启动一个单独的服务实例,因为服务正在进行的工作(在我的测试用例中,通常写入新的日志文件)正在为每次调用再次完成。 我试图通过循环ActivityManager来检测服务… getRunningServices(Integer.MAX_VALUE))但它没有显示出来。 SGS 11上的Android 2.3.3我在这里遗漏了一些东西。 我知道Service的onCreate()方法只在创建时被调用,而且因为我在服务中运行了一个连续的进程( 在我的Activity的onResume方法中,我正在启动服务(“myService”): Intent intent = new Intent(this, myService.class); startService(intent); 在MyService中,我有一个onCreate之类的 @Override public void onCreate(){ super.onCreate(); … 从我设置定时器的地方,使用TimerTask,一次/秒写入日志文件。 这按预期工作 – 我可以看到正在编写的日志。 在Activity的onResume方法中,在调用StartService方法之前,我通过调用包含checkForRunningService方法检查myService服务是否存在 for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (service.service.getClassName().contentEquals(“com.gpsanimator.startrax.myService”)) { Toast.makeText(getApplicationContext(), “Service IS SO running: “, Toast.LENGTH_SHORT).show(); return true; } 这永远不会findmyService服务,即使它似乎正在运行,因为它很乐意写入日志文件。 每次恢复我的Activity时,我的myService服务的onCreate方法被调用 – 它生成一个新的日志文件并开始写入它以及不断更新的原始日志文件。 第一次调用startService时服务是否启动? 然后继续跑? 后续调用startService()是否应该发现服务已经运行,因此不会再次触发onCreate()方法? 但那不是我所看到的。 […]

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

我正在尝试创建一个允许用户记录路线(位置/ GPS)的应用程序。 为了确保即使屏幕关闭也记录了位置,我已经为位置记录创建了foreground service 。 我将位置存储在Room Database ,该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 […]

计时器在背景中

我正在为大学工作开发Android应用程序。 在这项工作中,我想用计时器创建一个后台服务,当我关闭应用程序时,计时器仍在运行。 当我打开应用程序时,我可以看到自从我开始服务以来的时间。 好吧,我的问题是当我关闭应用程序时,后台计时器停止而不是增加更多。 你能帮我吗? 非常感谢 我的发射器课 import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private Button startButton; private Button pauseButton; private TextView timerValue; Intent intent; long timeSwapBuff = 0L; long updatedTime = 0L; @Override public void […]

允许在调用stopForeground后取消通知(false)

我有一个媒体服务,它使用startForeground()在播放开始时显示通知。 播放时有暂停/停止按钮,暂停时有播放/停止按钮。 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); // setup… Notification n = mBuilder.build(); if (state == State.Playing) { startForeground(mId, n); } else { stopForeground(false); mNotificationManager.notify(mId, n); } 这里的问题是当我显示/更新处于暂停状态的通知时,应该允许您将其删除。 mBuilder.setOngoing(false)似乎没有效果,因为之前的startForeground会覆盖它。 调用stopForeground(true); 使用相同的代码按预期工作,但通知会在销毁和重新创建时闪烁。 有没有办法“更新”从startForeground创建的通知,以便在调用stop后将其删除? 编辑:根据要求,这是创建通知的完整代码。 只要播放或暂停服务,就会调用createNotification。 private void createNotification() { NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle(“No Agenda”) .setContentText(“Live stream”); if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { if (state […]

绕过Android中的Google TTS Engine初始化延迟

我尝试在手机中触发特定事件时播放TextToSpeech对象。 但是,我遇到了大多数手机上安装的默认Google TTS引擎的问题。 截至目前,我正在初始化TextToSpeech对象后立即播放一些文本,并在语音完成后立即关闭资源,如下面的代码所示: public class VoiceGenerator { private Context context = null; private static TextToSpeech voice = null; public VoiceGenerator(Context context) { this.context = context; } public void voiceInit(String text) { try { if (voice == null) { new Thread(new Runnable() { @Override public void run() { voice = new TextToSpeech(context, new TextToSpeech.OnInitListener() { […]