Android 无法从片段启动传感器服务 class
Android unable to start sensor service class from fragment
我有一个带有导航抽屉的主 activity,它可以将不同的页面显示为片段。在其中一个片段中有一个按钮,即使在屏幕关闭(唤醒锁定)时,单击该按钮也会启动传感器服务并将传感器信息存储到后台的数据库中。
但是,当单击按钮时,似乎没有调用 onStartCommand
方法(它没有向 logcat 记录任何内容)
我不确定为什么服务没有启动。我已经看到很多关于此的 tutorials/questions,但它们都使用活动,但在我的例子中,我试图从 MainActivity 中的片段启动传感器服务 class。我的很多困惑源于混合片段和活动,以及如何从片段正确启动服务
这是带有按钮的片段:
public class StartFragment extends Fragment implements View.OnClickListener {
Button startButton;
Boolean started = false;
CoordinatorLayout coordinatorLayout;
MainActivity mainActivity;
public StartFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_start, container, false);
coordinatorLayout = (CoordinatorLayout) getActivity().findViewById(R.id.coordinator_layout);
//Set the nav drawer item highlight
mainActivity = (MainActivity)getActivity();
mainActivity.navigationView.setCheckedItem(R.id.nav_start);
//Set actionbar title
mainActivity.setTitle("Start");
//Set onclick listener for save button
startButton = (Button) view.findViewById(R.id.startButton);
startButton.setOnClickListener(this);
// Inflate the layout for this fragment
return view;
}
@Override
public void onClick(View v) {
if (!started){
mainActivity.startService(new Intent(mainActivity, SensorService.class));
startButton.setText(getResources().getString(R.string.start_button_label_stop));
Snackbar.make(coordinatorLayout, "Recording...", Snackbar.LENGTH_SHORT).show();
} else {
mainActivity.stopService(new Intent(mainActivity, SensorService.class));
startButton.setText(getResources().getString(R.string.start_button_label_start));
Snackbar.make(coordinatorLayout, "Recording stopped.", Snackbar.LENGTH_SHORT).show();
}
started = !started;
}
}
这里是 SensorService
class 应该 运行 单击按钮:
public class SensorService extends Service implements SensorEventListener {
public static final String TAG = SensorService.class.getName();
public static final int SCREEN_OFF_RECEIVER_DELAY = 500;
private SensorManager sensorManager = null;
private WakeLock wakeLock = null;
private Sensor sensor;
Sensor accelerometer;
Sensor gyroscope;
Sensor gravity;
Sensor magnetic;
private void registerListener() {
sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
sensorManager.registerListener(this, gyroscope, SensorManager.SENSOR_DELAY_FASTEST);
sensorManager.registerListener(this, gravity, SensorManager.SENSOR_DELAY_FASTEST);
sensorManager.registerListener(this, magnetic, SensorManager.SENSOR_DELAY_FASTEST);
}
private void unregisterListener() {
sensorManager.unregisterListener(this);
}
public BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "onReceive("+intent+")");
if (!intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
return;
}
Runnable runnable = new Runnable() {
public void run() {
Log.i(TAG, "Runnable executing.");
unregisterListener();
registerListener();
}
};
new Handler().postDelayed(runnable, SCREEN_OFF_RECEIVER_DELAY);
}
};
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//Safe not to implement
}
public void onSensorChanged(SensorEvent event) {
//TODO add async task to insert to DB
}
@Override
public void onCreate() {
super.onCreate();
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
accelerometer = sensorManager.getDefaultSensor(MainActivity.TYPE_ACCELEROMETER);
gyroscope = sensorManager.getDefaultSensor(MainActivity.TYPE_GYROSCOPE);
gravity = sensorManager.getDefaultSensor(MainActivity.TYPE_GRAVITY);
magnetic = sensorManager.getDefaultSensor(MainActivity.TYPE_MAGNETIC);
PowerManager manager =
(PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
registerReceiver(receiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));
}
@Override
public void onDestroy() {
unregisterReceiver(receiver);
unregisterListener();
wakeLock.release();
stopForeground(true);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Log.d(TAG, "onStartCommand");
startForeground(Process.myPid(), new Notification());
registerListener();
wakeLock.acquire();
return START_STICKY;
}
}
尝试将此添加到应用程序标记内的 XML 清单中,在其他任何内容之外:
<service android:name=".SensorService" />
如果有帮助请告诉我。
我有一个带有导航抽屉的主 activity,它可以将不同的页面显示为片段。在其中一个片段中有一个按钮,即使在屏幕关闭(唤醒锁定)时,单击该按钮也会启动传感器服务并将传感器信息存储到后台的数据库中。
但是,当单击按钮时,似乎没有调用 onStartCommand
方法(它没有向 logcat 记录任何内容)
我不确定为什么服务没有启动。我已经看到很多关于此的 tutorials/questions,但它们都使用活动,但在我的例子中,我试图从 MainActivity 中的片段启动传感器服务 class。我的很多困惑源于混合片段和活动,以及如何从片段正确启动服务
这是带有按钮的片段:
public class StartFragment extends Fragment implements View.OnClickListener {
Button startButton;
Boolean started = false;
CoordinatorLayout coordinatorLayout;
MainActivity mainActivity;
public StartFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_start, container, false);
coordinatorLayout = (CoordinatorLayout) getActivity().findViewById(R.id.coordinator_layout);
//Set the nav drawer item highlight
mainActivity = (MainActivity)getActivity();
mainActivity.navigationView.setCheckedItem(R.id.nav_start);
//Set actionbar title
mainActivity.setTitle("Start");
//Set onclick listener for save button
startButton = (Button) view.findViewById(R.id.startButton);
startButton.setOnClickListener(this);
// Inflate the layout for this fragment
return view;
}
@Override
public void onClick(View v) {
if (!started){
mainActivity.startService(new Intent(mainActivity, SensorService.class));
startButton.setText(getResources().getString(R.string.start_button_label_stop));
Snackbar.make(coordinatorLayout, "Recording...", Snackbar.LENGTH_SHORT).show();
} else {
mainActivity.stopService(new Intent(mainActivity, SensorService.class));
startButton.setText(getResources().getString(R.string.start_button_label_start));
Snackbar.make(coordinatorLayout, "Recording stopped.", Snackbar.LENGTH_SHORT).show();
}
started = !started;
}
}
这里是 SensorService
class 应该 运行 单击按钮:
public class SensorService extends Service implements SensorEventListener {
public static final String TAG = SensorService.class.getName();
public static final int SCREEN_OFF_RECEIVER_DELAY = 500;
private SensorManager sensorManager = null;
private WakeLock wakeLock = null;
private Sensor sensor;
Sensor accelerometer;
Sensor gyroscope;
Sensor gravity;
Sensor magnetic;
private void registerListener() {
sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
sensorManager.registerListener(this, gyroscope, SensorManager.SENSOR_DELAY_FASTEST);
sensorManager.registerListener(this, gravity, SensorManager.SENSOR_DELAY_FASTEST);
sensorManager.registerListener(this, magnetic, SensorManager.SENSOR_DELAY_FASTEST);
}
private void unregisterListener() {
sensorManager.unregisterListener(this);
}
public BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "onReceive("+intent+")");
if (!intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
return;
}
Runnable runnable = new Runnable() {
public void run() {
Log.i(TAG, "Runnable executing.");
unregisterListener();
registerListener();
}
};
new Handler().postDelayed(runnable, SCREEN_OFF_RECEIVER_DELAY);
}
};
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//Safe not to implement
}
public void onSensorChanged(SensorEvent event) {
//TODO add async task to insert to DB
}
@Override
public void onCreate() {
super.onCreate();
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
accelerometer = sensorManager.getDefaultSensor(MainActivity.TYPE_ACCELEROMETER);
gyroscope = sensorManager.getDefaultSensor(MainActivity.TYPE_GYROSCOPE);
gravity = sensorManager.getDefaultSensor(MainActivity.TYPE_GRAVITY);
magnetic = sensorManager.getDefaultSensor(MainActivity.TYPE_MAGNETIC);
PowerManager manager =
(PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
registerReceiver(receiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));
}
@Override
public void onDestroy() {
unregisterReceiver(receiver);
unregisterListener();
wakeLock.release();
stopForeground(true);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Log.d(TAG, "onStartCommand");
startForeground(Process.myPid(), new Notification());
registerListener();
wakeLock.acquire();
return START_STICKY;
}
}
尝试将此添加到应用程序标记内的 XML 清单中,在其他任何内容之外:
<service android:name=".SensorService" />
如果有帮助请告诉我。