2017-12-27 299 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的通知。

相關問題