2017-12-27 26 views
-2

私はバックグラウンドで永遠にサービスを実行したいが、いつかはYouTubeとインターネット上のすべてのソリューションをチェックしたが、回答が得られなかったので、onStartCommand()またはonTaskRemoved()でSTART_STICKYを使用するか、メソッドが動作しませんでした。スリープモードの電話や他のアプリを実行しているにもかかわらず、バックグラウンドでサービスを永久に実行するにはどうすればよいですか?

これは私のTheServiceクラスコードです。 `

パッケージ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

[This](https://stackoverflow.com/questions/15758980/android-service-needs-to-run-always-never-pause-or-stop)を読んで、Android Apiレベルの変更についても読んでください。特にAndroid Mと後で。 – ADM

答えて

0

簡単な答えは:それはできません! Androidはモバイルデバイス用に作成されたOSです。モバイルデバイスは、メモリが制約された小型のバッテリ駆動のコンピュータです。そのことを念頭において、OSはメモリが必要なときはいつでもサービスを終了します。

OSの最新バージョン(特にNougatとOreo)では、これらの制限がユーザーに余分なバッテリーを供給するためにより重く課されています。

あなたがオンラインで見つけてくれればどんなトリック、ハック、回避策でも、それはちょっとしたことです。特定の条件や特定のデバイスでは少し動くかもしれませんが、サービスは永遠に実行されることはありません。特に、最新のAndroidsはありません。

  1. リターンSTART_STICKY(あなたがすでにやっているように):

    に最高のシナリオは、可能な限りのために、あなたのサービスの実行を持っているを試すには、2つのことを行うことです。これは、あなたのサービスができるだけ長く実行されることをOSに指示しますが、保証はゼロになります。

  2. フォアグラウンドサービスを使用します。 startForeground(int, Notification)メソッドを呼び出すと、デバイスの通知パネルに通知が表示されます。これにより、プロセスがフォアグラウンド状態になり、もう少し長い間はそれを維持できますが、保証はありません。追伸:サービスonDestroyの通知を削除することを忘れないでください。

関連する問題