0

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; 
    } 
} 
+0

Hizmetinizi manifest'e eklediniz mi? – mmcoder10

+0

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

+0

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

cevap

1

deneyin başka bir şey dışında, uygulama etiketinin içinde Manifest sizin XML bu ekleme:

<service android:name=".SensorService" /> 

Bu yardımcı olup olmadığını bana bildirin.

+0

Burada manifestasyonun eklenmesi gereken yer neresidir? bloğu içinde mi? Ya da dışında? – Simon

+0

İç uygulama, herhangi bir aktivitenin dışında – mmcoder10

+0

Bu işe yaradı, teşekkürler! – Simon