-1

Ist es möglich, HandlerThread innen BroadcastReceiver ‚s OnReceive Methode zu verwenden, die weiter startet einen Dienst auf dem Haupt UI Gewinde ??HandlerThread innen BroadcastReceiver

Mein Ziel ist es HandlerThread innerhalb OnReceive Methode zu verwenden, so dass der Dienst in dem separaten Thread gestartet wird.

Aber ich weiß nicht, wie man es implementiert.

Irgendwelche Hinweise?

Dank

EDIT: Service-Klasse

public class BackgroundVideoRecorder extends Service implements SurfaceHolder.Callback { 

public WindowManager windowManager; 
public SurfaceView surfaceView; 
public Camera camera = null; 
public MediaRecorder mediaRecorder = null; 


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



@Override 
public void onCreate() { 

    // Create new SurfaceView, set its size to 1x1, move it to the top left corner and set this service as a callback 
    windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
    surfaceView = new SurfaceView(getApplicationContext()); 
    WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
      1, 1, 
      WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
      WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
      PixelFormat.TRANSLUCENT 
    ); 
    layoutParams.gravity = Gravity.LEFT | Gravity.TOP; 
    windowManager.addView(surfaceView, layoutParams); 
    surfaceView.getHolder().addCallback(this); 

} 

// Method called right after Surface created (initializing and starting MediaRecorder) 
@Override 
public void surfaceCreated(SurfaceHolder surfaceHolder) { 

    try { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (ContextCompat.checkSelfPermission(getApplicationContext(), CAMERA) == PackageManager.PERMISSION_GRANTED) { 
       camera = Camera.open(); 
      }else{ 
       // should show permission 
      } 

     } else { 
      camera = Camera.open(); 
     } 
     mediaRecorder = new MediaRecorder(); 
     camera.unlock(); 

     mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); 
     mediaRecorder.setCamera(camera); 
     mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
     mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_1080P)); 


     mediaRecorder.setOutputFile(
       Environment.getExternalStorageDirectory() + "/" + 
         DateFormat.format("yyyy-MM-dd_kk-mm-ss", new Date().getTime()) + 
         ".mp4" 
     ); 

     try { 
      mediaRecorder.prepare(); 
     } catch (Exception e) { 
     } 
     mediaRecorder.start(); 

    } catch (Exception e) { 

    } 


} 

// Stop recording and remove SurfaceView 
@Override 
public void onDestroy() { 

    mediaRecorder.stop(); 
    mediaRecorder.reset(); 
    mediaRecorder.release(); 

    camera.lock(); 
    camera.release(); 

    windowManager.removeView(surfaceView); 

} 


@Override 
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) { 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
} 


} 

Ich glaube, ich nicht Dienste richtig bin. Bitte helfen Sie.

EDIT2: Logcat

08/11 18:00:20: Launching app 
$ adb push  F:\AndroidStudioWorkspace\MyApplication2\app\build\outputs\apk\app-debug.apk /data/local/tmp/com.example.jatin.myapplication2 
$ adb shell pm install -r "/data/local/tmp/com.example.jatin.myapplication2" 
    pkg: /data/local/tmp/com.example.jatin.myapplication2 
Success 


$ adb shell am start -n  "com.example.jatin.myapplication2/com.example.jatin.AgentSpy.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER 
Client not ready yet..Waiting for process to come online 
Connected to process 7445 on device xiaomi-mi_4i-a67ae459 
D/###BVRREC###: true 
I/MediaRecorderJNI: prepare: surface=0x5583ad0d30 
I/Choreographer: Skipped 64 frames! The application may be doing too much  work on its main thread. 
D/###BVRREC###: false 
V/RenderScript: Application requested CPU execution 
V/RenderScript: 0x558342fa80 Launching thread(s), CPUs 8 
D/###BVRREC###: true 
I/MediaRecorderJNI: prepare: surface=0x5583b23330 
I/Choreographer: Skipped 42 frames! The application may be doing too much  work    on its main thread. 
    D/###BVRREC###: false 
    Application terminated. 
+0

Warum möchten Sie 'startService()' in einem separaten Thread aufrufen? Erkläre bitte. –

+0

Da jedes Mal, wenn ich die Anwendung ausführe, eine Nachricht in meiner Protokollkatze ist: "Zu viel am Hauptthread gewärmt" und mein Gerät verlangsamt sich. –

+0

Sie werden das nicht beheben, indem Sie 'startService()' in einem anderen Thread aufrufen. Dein Problem ist woanders. Poste den Code deiner 'onStart()' oder 'onStartCommand()' Methode. –

Antwort

0

Siehe BroadcastReceiver, können Sie NICHT Verwendung HandlerThread in onReceive Methode:

Receiver Lifecycle

alles, was einen asynchronen Betrieb erfordert nicht verfügbar ist, weil Sie von der Rückkehr müssen Funktion, um den asynchronen Vorgang zu verarbeiten, aber zu diesem Zeitpunkt ist der BroadcastReceiver nicht mehr aktiv, und daher kann das System seinen Prozess beenden, bevor der asynchrone Vorgang abgeschlossen ist.

Process Lifecycle

...... Das bedeutet, dass für länger laufende Operationen Sie oft einen Dienst in Verbindung mit einem BroadcastReceiver verwenden enthält Prozess aktiv für die gesamte Zeit zu halten von Ihre Operation.

SO BITTE ANDROID API FOLGEN GUIDES: ein länger laufender Betrieb ausgeführt werden, wenn onReceive aufgerufen, Sie einen Dienst starten sollen, dann einen anderen Thread in Dienst erstellen.

Beziehen Sie sich auf Extending the Service class für Beispielcode, die eine HandlerThread erstellen und nur für 5 Sekunden schlafen, wenn Nachricht empfangen.

+0

Dann jeden Vorschlag, wie man lange laufenden Betrieb innerhalb auf Empfangen außer Service, wie ich mit Service immer noch nicht gewünschte Ergebnisse –

+0

ausführen ausführen Langfristiger Betrieb ist Ihr Zweck, warum Service Ihren Wunsch nicht erfüllen kann? Wie implementieren Sie es? – li2

+0

Exatly.There Sie sind. Ich suche eine Lösung für dieses Problem, warum es zeigt "Die Anwendung kann zu viel Arbeit an seinem Hauptthread durchführen", obwohl meine App funktioniert, aber mein Gerät verlangsamt –