Farklı sayfaları sayfa olarak gösteren bir nav çekmecesi ile ana aktivitem var. Parçalardan birinde tıklandığında, bir sensör servisi başlayacak ve ekran kapanmış olsa bile sensör bilgisini arka planda bir veritabanına kaydedecektir (uyandırma kilidi). düğme tıklandığındaAndroid, parça başına sensör hizmet sınıfını başlatamadı
Ancak onStartCommand
yöntem hizmeti başlangıç değil neden emin değilim (LogCat onun günlüğü değil bir şey)
çağrılacak görünmüyor. Bu konuda bir dizi öğretici/soru gördüm, ancak hepsi aktiviteler kullanıyorlar, fakat benim durumumda, sensör servis sınıfını bir MainActivity içindeki bir parçadan başlatmaya çalışıyorum. düğmesiyle fragmanı benim Bir sürü karmaşa karıştırma parçaları ve faaliyetleri ve nasıl doğru bir parçası İşte
den hizmetlerini başlatmak için kaynaklanıyor geçerli:
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;
}
}
Ve burada çalışmalıdır SensorService
sınıftır düğme tıklama:
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;
}
}
Hizmetinizi manifest'e eklediniz mi? – mmcoder10
Log.d ("test", "onClick") eklemeyi deneyin; ifClick metodunun içindeki komutlar, eğer çağrılmışsa, görmeye başladı. Ancak orada herhangi bir hata görmüyorum. Bu, bir Fragmandan bir hizmet başlatmanın doğru yoludur. – mmcoder10
Sadece bunu denedim ve iyi görünüyor. Bu yüzden en azından sorun, "onClick" in kontrolleri "! Başlatıldı" durumunda değil – Simon