所以我在Android中有一个像这样运行的进程:
process = Runtime.getRuntime().exec(commandString);
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
Log.d("ShutDownHook Called");
process.destroy();
}
}));
命令字符串包含文件路径和其他一些参数。 该过程是一个CPU繁重的过程,可能需要持续几个小时(电影转码)。该文件是一个ffmpeg静态文件。问题是在某些情况下即使我杀死了应用程序,该过程也会保留在后台。当我用任务管理器杀死应用程序时,我的一个手机就出现了这种情况。话虽如此,不会调用onDestroy()方法,也不会调用应用程序类中的onTerminate(),也不会调用上面的关闭钩子。
此外,我已经创建了一个带有通知的后台服务,因此当退出应用程序时,服务应该保留在后台。即使有这种控制,当我用任务管理器杀死应用程序时,服务重新启动,我丢失了对我的ffmpeg类,异步任务,进程等的所有引用,我无法停止进程,因为我有空指针。 无论如何,我可以确保该服务不会被应用程序杀死篡改,所以我可以通过我的服务中的通知栏终止该过程?
ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
Log.d("HelperActivity", "onServiceDisconnected");
mIsBound = false;
mServer = null;
}
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d("HelperActivity", "onServiceConnected");
mIsBound = true;
NotificationService.LocalBinder mLocalBinder = (NotificationService.LocalBinder)service;
mServer = mLocalBinder.getServerInstance();
//mServer.test();
}
};
//This is the onCreate of the application class
@Override
public void onCreate() {
super.onCreate();
Intent intent = new Intent(this,
NotificationService.class);
startService(intent);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
Log.d("onCreate", "Called");
singleton = this;
}
我一直在使用http://hiteshsondhi88.github.io/ffmpeg-android-java/来支持ffmpeg。当然添加了新功能,但运行ffmpeg命令的基本概念是相同的。
另一件奇怪的事情是,当我启动应用程序时,我删除了以前的文件,并且该进程仍然在后台运行,导致我的转码性能减半。每次启动应用程序时,文件都会从资产复制到内部存储。
File ffmpegFile = new File(FileUtils.getFFmpeg(context));
if (ffmpegFile.exists()) {
Log.d("File exists!");
ffmpegFile.delete();
}
我检查过该文件,但我的CPU仍然使用了很多。 对于帖子中的任何错误,对不起,这是我的第一个。