BroadcastReceiver中的HandlerThread

时间:2016-08-06 21:41:04

标签: android broadcastreceiver android-service android-handlerthread

是否可以在 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.

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

请参阅BroadcastReceiver,您可以 HandlerThread方法中使用onReceive

  

接收器生命周期

     

任何需要异步操作的东西都不可用,因为您需要从函数返回来处理异步操作,但此时BroadcastReceiver不再处于活动状态,因此系统可以在异步之前自由地终止其进程操作完成。

     

流程生命周期

     

......这意味着用于更长时间运行的操作,您通常会将服务与BroadcastReceiver结合使用以保持包含进程处于活动状态整个手术时间。

请关注ANDROID API指南:要在调用onReceive时运行运行时间更长的操作,您应该启动一项服务,然后创建另一个正在服务的线程。

有关创建HandlerThread的示例代码,请参阅Extending the Service class,并在收到消息时暂停5秒钟。