【问题标题】:Foreground service gets killed every time前台服务每次都被杀死
【发布时间】:2014-12-14 16:08:05
【问题描述】:

当我启动在后台压缩大量文件的服务时,它总是在大约 8% 和 15-30 秒后被杀死。我怎样才能防止这种情况并让我的服务完成它的任务?该服务没有绑定任何东西,这可能是问题吗?

//编辑: 我用它创建了一个前台服务,但它仍然被终止。

public class PackingService extends Service {
    String basePath = ""+ Environment.getExternalStorageDirectory();
    String source = basePath+"/data.zip";
    File dir = new File(basePath+"/data");


    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle("Zipping")
            .setContentText("...");

        startForeground(1337, nBuilder.build());

        try{
            ZipFile zipFile = new ZipFile(source);

            Log.d("ZIP", "Preparing files...");
            ArrayList filesToAdd = new ArrayList();
            addDirectory(dir, filesToAdd);

            ZipParameters parameters = new ZipParameters();
            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_ULTRA);

            zipFile.setRunInThread(true);
            ProgressMonitor monitor = zipFile.getProgressMonitor();

            Log.d("ZIP", "Creating zip...");
            zipFile.createZipFile(filesToAdd, parameters);

            int percent = -1;
            while(monitor.getState() == ProgressMonitor.STATE_BUSY){
                if(percent != monitor.getPercentDone()) {
                    percent = monitor.getPercentDone();
                    Log.d("Progress", percent + "%");
                }
            }
        } catch (ZipException e) {
            e.printStackTrace();
        }

        stopForeground(true);

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    public void addDirectory (File dir, ArrayList filesToAdd) {
        if (dir.exists()) {
            File[] files = dir.listFiles();
            for (int i = 0; i < files.length; ++i) {
                File file = files[i];
                if (file.isDirectory()) {
                    addDirectory(file, filesToAdd);
                } else {
                    filesToAdd.add(file);
                }
            }
        }
}

日志:

dalvikvm﹕ threadid=3: reacting to signal 3
dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt'

【问题讨论】:

    标签: android service process android-service


    【解决方案1】:

    我通过不使用Service 而是使用IntentService 解决了这个问题。然后我将整个邮政编码放入IntentServiceonHandleIntent 方法中,并在它之前调用startForeground。压缩完成后,我打电话给stopForeground,一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2019-05-30
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      相关资源
      最近更新 更多