0

Ich habe eine Hauptaktivität mit einer Nav-Schublade, die verschiedene Seiten als Fragmente hervorbringt. In einem der Fragmente befindet sich eine Schaltfläche, die beim Anklicken einen Sensor-Dienst startet und Sensorinformationen in einer Datenbank im Hintergrund speichert, auch wenn der Bildschirm ausgeschaltet ist (Wecksperre).Android kann die Sensor-Serviceklasse nicht starten von Fragment

Wenn jedoch die Schaltfläche geklickt wird die onStartCommand Methode scheint nicht (es ist nicht die Anmeldung etwas logcat)

Ich bin nicht sicher genannt zu werden, warum der Dienst nicht an den Start. Ich habe eine Reihe von Tutorials/Fragen dazu gesehen, aber alle verwenden Aktivitäten, aber in meinem Fall versuche ich, die Sensor-Service-Klasse aus einem Fragment innerhalb einer MainActivity zu starten. Viele meiner Verwirrung ergibt sich aus Misch Fragmente und Aktivitäten, und wie man richtig Dienste von einem Fragment starten

Hier ist das Fragment mit der Taste:

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

Und hier ist die SensorService-Klasse, die auf laufen soll Schaltfläche klicken:

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

Haben Sie Ihren Service zum Manifest hinzugefügt? – mmcoder10

+0

Versuchen Sie Log.d hinzuzufügen ("test", "onClick"); Befehle innerhalb der onClick-Methode innerhalb von if! started, um zu sehen, ob sie aufgerufen wird. Allerdings sehe ich dort keinen Fehler. Dies ist die korrekte Methode zum Starten eines Dienstes von einem Fragment. – mmcoder10

+0

Ich habe das gerade versucht und es scheint in Ordnung zu sein. Zumindest ist das Problem nicht im 'onClick', wenn seine checks '! Started ' – Simon

Antwort

1

Versuchen Sie dieses Manifest in der Anwendung Tag, außerhalb alles in Ihrem XML Hinzufügen anderes:

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

Lassen Sie mich wissen, ob dies geholfen hat.

+0

Wo im Manifest sollte das hinzugefügt werden? Innerhalb des Blocks? Oder draußen? – Simon

+0

Innerhalb Anwendung außerhalb von Aktivitäten – mmcoder10

+0

Das hat funktioniert, danke! – Simon