后台服务是 freezing/lagging android 应用程序
Background service is freezing/lagging android app
我一直在开发一个 android 应用程序,其中有一个服务,我想 运行 它永远。
我正在使用 广播接收器 在 oncreate of service[=40] 中获取 screen on-off intents =] 并使用 警报管理器 每隔 25 秒在 onstartcommand 中启动 服务本身,并在 onstartcommand 中执行我的其他操作。我已将所有代码放在 onstartcommand 中的一个线程 中。但问题是一旦服务在 运行 中 几个小时 在 background 并且我 重新打开应用程序 应用程序启动 滞后并变得非常慢 。在启动服务之前,该应用程序运行良好。
我的代码简介如下-
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
AlarmManager alarmManagerMain;
BroadcastReceiver receiver;
Thread t;
Thread thread;
@Override
public void onCreate() {
super.onCreate();
t = new Thread(() -> {
HandleReceiver();
});
t.start();
CreateNotificationChannel();
startNotification();
}
private void HandleReceiver() {
try {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_SCREEN_ON))
{
// ...
// My Code
// ...
// Starting Service to call onStartCommand
Intent serviceIntent = new Intent(context, MyService.class);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
startForegroundService(serviceIntent);
}
else
{
startService(serviceIntent);
}
}
else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF))
{
// ...
// My Code
// ...
}
}
};
MyService.this.registerReceiver(receiver, intentFilter);
}
catch (Exception ignore) { }
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
Runnable runnable = () -> {
if(allowNotificationAndAlerts)
{
// My Code
}
// This function is to start the service even after the system kills it
startAlarm();
};
thread = new Thread(runnable);
thread.start();
return super.onStartCommand(intent, flags, startId);
}
private void startAlarm()
{
AlarmManager alarmManager = (AlarmManager) MyService.this.getSystemService(Service.ALARM_SERVICE);
Intent myIntent = new Intent(MyService.this, MyBroadCastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MyService.this, 1, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 25);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
}
@Override
public void onDestroy() {
stopForeground(false);
unregisterReceiver(receiver);
super.onDestroy();
}
}
我的问题是-
- 我怎样才能优化服务运行它永远在后台而不导致应用程序延迟
- 有什么方法可以通过 系统 或其他任何方式而不是 [=60 让 屏幕关闭 intents =]使用广播接收器
连接服务
我得到了答案
我能够通过从清单中的服务中删除“android:process=:remote”行并将共享首选项更改为数据库来解决这个问题可能是因为共享首选项不是进程安全的
我一直在开发一个 android 应用程序,其中有一个服务,我想 运行 它永远。
我正在使用 广播接收器 在 oncreate of service[=40] 中获取 screen on-off intents =] 并使用 警报管理器 每隔 25 秒在 onstartcommand 中启动 服务本身,并在 onstartcommand 中执行我的其他操作。我已将所有代码放在 onstartcommand 中的一个线程 中。但问题是一旦服务在 运行 中 几个小时 在 background 并且我 重新打开应用程序 应用程序启动 滞后并变得非常慢 。在启动服务之前,该应用程序运行良好。
我的代码简介如下-
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
AlarmManager alarmManagerMain;
BroadcastReceiver receiver;
Thread t;
Thread thread;
@Override
public void onCreate() {
super.onCreate();
t = new Thread(() -> {
HandleReceiver();
});
t.start();
CreateNotificationChannel();
startNotification();
}
private void HandleReceiver() {
try {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_SCREEN_ON))
{
// ...
// My Code
// ...
// Starting Service to call onStartCommand
Intent serviceIntent = new Intent(context, MyService.class);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
startForegroundService(serviceIntent);
}
else
{
startService(serviceIntent);
}
}
else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF))
{
// ...
// My Code
// ...
}
}
};
MyService.this.registerReceiver(receiver, intentFilter);
}
catch (Exception ignore) { }
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
Runnable runnable = () -> {
if(allowNotificationAndAlerts)
{
// My Code
}
// This function is to start the service even after the system kills it
startAlarm();
};
thread = new Thread(runnable);
thread.start();
return super.onStartCommand(intent, flags, startId);
}
private void startAlarm()
{
AlarmManager alarmManager = (AlarmManager) MyService.this.getSystemService(Service.ALARM_SERVICE);
Intent myIntent = new Intent(MyService.this, MyBroadCastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MyService.this, 1, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 25);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
}
@Override
public void onDestroy() {
stopForeground(false);
unregisterReceiver(receiver);
super.onDestroy();
}
}
我的问题是-
- 我怎样才能优化服务运行它永远在后台而不导致应用程序延迟
- 有什么方法可以通过 系统 或其他任何方式而不是 [=60 让 屏幕关闭 intents =]使用广播接收器 连接服务
我得到了答案 我能够通过从清单中的服务中删除“android:process=:remote”行并将共享首选项更改为数据库来解决这个问题可能是因为共享首选项不是进程安全的