我正在开发一个使用意图服务来备份一些文件的应用程序。该应用程序运行良好,不会崩溃。但是,当我在后台启动应用程序时,应用程序有时会在它运行两天或有时只运行一晚时关闭。
是因为该设备内存不足而我的应用程序无法正确关闭吗?
是否有任何意图,即我在我的应用程序中处理这种情况,我将向我的用户展示最后一个进程停止的原因。
我正在开发一个使用意图服务来备份一些文件的应用程序。该应用程序运行良好,不会崩溃。但是,当我在后台启动应用程序时,应用程序有时会在它运行两天或有时只运行一晚时关闭。
是因为该设备内存不足而我的应用程序无法正确关闭吗?
是否有任何意图,即我在我的应用程序中处理这种情况,我将向我的用户展示最后一个进程停止的原因。
是的。您的问题确实是由于设备内存不足。
当资源变少时,Android 会简单地处理正在运行的服务,例如您的服务。
接下来会发生什么取决于你
声明为粘性
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
一旦资源再次上升,将上述内容添加到您的服务将强制Android在杀死后重新启动它。
如果正在运行的服务对您的系统至关重要,并且您不希望它在任何情况下自动终止(提示:大多数时候这不是您想要的),您可以通过将其声明为前台服务来实现
Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setTicker("ticker text").setContentTitle("title text").setContentText("content")
.setWhen(System.currentTimeMillis()).setAutoCancel(false)
.setOngoing(true).setPriority(Notification.PRIORITY_HIGH)
.setContentIntent(pendIntent);
Notification notif = builder.build();
notif.flags |= Notification.FLAG_NO_CLEAR;
startForeground(NOTIF_ID, notif);
最后一点:IntentService只产生一个执行所有请求的线程。这在许多情况下都可以正常工作。但是,当涉及到 IO-bound 执行时,通常使用多线程可以获得更好的性能。
因此,只有当性能成为问题时,才考虑使用例如多线程池来完成这项工作:
ThreadFactory threadFactory = Executors.defaultThreadFactory();
ThreadPoolExecutor executorPool = new ThreadPoolExecutor(
MIN_NUM_THREADS, MAX_NUM_THREADS, 10, TimeUnit.SECONDS, ...);
...
executorPool.execute(new MyWorkerThread(params));
ThreadPoolExecutor 构造函数接收的前两个参数设置最小和最大并发活动线程数。
您可以使用这些来测量内存。
Gdx.app.getJavaHeap();
Gdx.app.getNativeHeap();
由于您的应用程序在后台运行,也许您可以保存这些值以供以后研究?