2017-12-27 300 views
-2

我想在后台永远运行我的服务,但在某些时候我检查了Youtube和Internet上的每个解决方案后停止了,但我没有得到答案,我尝试了像在onStartCommand()中使用START_STICKY或使用onTaskRemoved()方法,但它没有工作。任何帮助,将不胜感激。无论手机处于睡眠模式还是运行其他应用程序,如何在后台运行服务?

这是我的TheService类代码。 `

` package apphub.secretapp;

import android.app.Service; 


import android.content.Intent; 

import android.media.MediaPlayer; 

import android.media.MediaRecorder; 

import android.os.Build; 

import android.os.Environment; 

import android.os.IBinder; 

import android.os.SystemClock; 

import android.widget.Toast; 

import java.io.File; 

import java.io.IOException; 

import java.text.SimpleDateFormat; 

import java.util.Date; 

import java.util.Locale; 

import java.util.Random; 

/** 
* Created by as on 12/24/2017. 
*/ 

public class TheService extends Service implements 
MediaRecorder.OnInfoListener { 

String AudioSavePathInDevice = null; 
MediaRecorder mediaRecorder ; 
Random random ; 
String RandomAudioFileName = "ABCDEFGHIJKLMNOP"; 
public static final int RequestPermissionCode = 1; 
MediaPlayer mediaPlayer ; 
private MediaRecorder mRecorder; 
private long mStartTime; 

//setting maximum file size to be recorded 
private long Audio_MAX_FILE_SIZE = 1000000;//1Mb 

private int[] amplitudes = new int[100]; 
private int i = 0; 

private File mOutputFile; 

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

} 



@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent,flags,startId); 
    Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show(); 
    return START_STICKY; 



} 



private void startRecording() { 
    mRecorder = new MediaRecorder(); 
    mRecorder.setOnInfoListener(this); 
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    mRecorder.setMaxFileSize(Audio_MAX_FILE_SIZE); 
    mRecorder.setOutputFormat 
      (MediaRecorder.OutputFormat.MPEG_4); 
    Toast.makeText(this, "Recording started", Toast.LENGTH_SHORT).show(); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) 
    { 
     mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC); 
     mRecorder.setAudioEncodingBitRate(48000); 
    } else { 
     mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
     mRecorder.setAudioEncodingBitRate(64000); 
    } 
    mRecorder.setAudioSamplingRate(16000); 
    mOutputFile = getOutputFile(); 
    mOutputFile.getParentFile().mkdirs(); 
    mRecorder.setOutputFile(mOutputFile.getAbsolutePath()); 

    try { 
     mRecorder.prepare(); 
     mRecorder.start(); 
     mStartTime = SystemClock.elapsedRealtime(); 
    } catch (IOException e) { 
    } 
} 

protected void stopRecording(boolean saveFile) { 
    mRecorder.stop(); 
    mRecorder.release(); 
    mRecorder = null; 
    mStartTime = 0; 
    if (!saveFile && mOutputFile != null) { 
     mOutputFile.delete(); 
    } 

    // to stop the service by itself 


} 
private File getOutputFile() { 
    SimpleDateFormat dateFormat = new SimpleDateFormat 
      ("yyyyMMdd_HHmmssSSS", Locale.US); 
    return new File(Environment.getExternalStorageDirectory().getAbsolutePath().toString() 
      + "/Voice Recorder/RECORDING_" 
      + dateFormat.format(new Date()) 
      + ".m4a"); 
} 



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

@Override 
public void onTaskRemoved(Intent rootIntent) { 
    Intent i =new Intent(getApplicationContext(),this.getClass()); 
    i.setPackage(getPackageName()); 
    startService(i); 


    super.onTaskRemoved(rootIntent); 
} 
@Override 
public void onInfo(MediaRecorder mr, int what, int extra) { 

    if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED) { 
    getOutputFile(); 

     startRecording(); 



    } 
} 



@Override 
public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
    startRecording(); 
} 

} 

`

+0

**永远?**好吧,如果你找到永远的解决方案,让我们都知道在这里。谢谢。 – ADM

+1

伙计,而不是投票请帮助我我是Android的新手。 – Ambuj

+0

阅读[本](https://stackoverflow.com/questions/15758980/android-service-needs-to-run-always-never-pause-or-stop),并阅读关于Android Api级别的变化特别是Android M和后来。 – ADM

回答

0

简单的答案是:你不能! Android是为移动设备创建的操作系统。移动设备是带有受限存储器的小型电池供电计算机。考虑到这一点,操作系统将在需要内存时终止服务。

在最新版本的操作系统(特别是Nougat和奥利奥)中,这些限制被强加给用户额外的电池。

你在网上找到的任何技巧,黑客和变通办法就是这样,技巧和黑客。他们可能会在某些条件下或某些设备上工作一段时间,但您仍然无法永久运行您的服务,特别是不会在最新的Android上运行。

最好的情况尽量有你的服务运行了尽可能多的是做两件事情:

  1. 回报START_STICKY(就像你已经这样做)。这向操作系统表明,您希望尽可能长时间运行您的服务,但它没有任何保证。

  2. 使用前台服务。调用方法startForeground(int, Notification),并在设备通知面板上显示通知。这会使您的进程处于前台状态并允许它停留更长时间,但是再次不保证。 PS .:记得删除您的服务onDestroy的通知。

相关问题