是否可以在 BroadcastReceiver 的 onReceive 方法中使用 HandlerThread ,该方法可在主UI线程<上进一步启动服务< /强> ...
我的目标是在 onReceive 方法中使用 HandlerThread ,以便在单独的线程中启动服务。
但不知道如何实施它。
任何提示?
由于
编辑:服务类
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) {
}
}
我认为我没有正确使用服务。请帮忙。
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 :(得分:0)
答案 1 :(得分:0)
请参阅BroadcastReceiver,您可以 在HandlerThread
方法中使用onReceive
:
接收器生命周期
任何需要异步操作的东西都不可用,因为您需要从函数返回来处理异步操作,但此时BroadcastReceiver不再处于活动状态,因此系统可以在异步之前自由地终止其进程操作完成。
流程生命周期
......这意味着用于更长时间运行的操作,您通常会将服务与BroadcastReceiver结合使用以保持包含进程处于活动状态整个手术时间。
请关注ANDROID API指南:要在调用onReceive
时运行运行时间更长的操作,您应该启动一项服务,然后创建另一个正在服务的线程。
有关创建HandlerThread
的示例代码,请参阅Extending the Service class,并在收到消息时暂停5秒钟。