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.
Warum möchten Sie 'startService()' in einem separaten Thread aufrufen? Erkläre bitte. –
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. –
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. –