2016-07-31 11 views
0

Viele Beispiele und Tutorials für Dienste auf Android sind für bound services, aber was ist, wenn ich einen ungebundenen Dienst erstellen möchte und überhaupt nicht mit der Bindung umgehen muss?Wie erstelle ich einen ungebundenen Dienst in Android?

 

Hinweis auf mögliche downvoters

Bitte lesen Sie auf, warum answering your own questions is a good thing vor Downvoting.

+0

Haben Sie gerade Ihren eigenen Beitrag innerhalb einer Minute beantworten ...!? – Shaishav

+0

@Shaishav Ja tat ich. In der Tat habe ich sie beantwortet, bevor ich sie gepostet habe, indem ich das Kontrollkästchen unten auf der Seite "Frage stellen" verwendet habe. Ich konnte keine klaren und vollständigen Demos für die Erstellung eines einfachen ungebundenen Dienstes hier auf Stackoverflow finden, also dachte ich mir, ich würde jetzt meine eigenen veröffentlichen, da ich weiß, wie es geht. [Lesen Sie mehr über das Beantworten Ihrer eigenen Fragen hier.] (Http://stackoverflow.com/help/self-answer) – BadCash

+0

Cool. Danke für die Information. – Shaishav

Antwort

1

Das erste, was zu tun ist, um den Dienst zu Ihrem Manifest, in dem <application> Tag hinzuzufügen:

<application ...> 

    ...   

    <service 
     android:name=".RecordingService" 
     android:exported="false"> 

</application> 

Dann erstellen wir die tatsächliche Serviceklasse:

public class RecordingService extends Service { 
    private int NOTIFICATION = 1; // Unique identifier for our notification 

    public static boolean isRunning = false; 
    public static RecordingService instance = null; 


    private NotificationManager notificationManager = null; 


    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate(){ 
     instance = this; 
     isRunning = true; 

     notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

     super.onCreate(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId){ 
     // The PendingIntent to launch our activity if the user selects this notification 
     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0); 

     // Set the info for the views that show in the notification panel. 
     Notification notification = new NotificationCompat.Builder(this) 
       .setSmallIcon(R.mipmap.ic_launcher)  // the status icon 
       .setTicker("Service running...")   // the status text 
       .setWhen(System.currentTimeMillis())  // the time stamp 
       .setContentTitle("My App")     // the label of the entry 
       .setContentText("Service running...")  // the content of the entry 
       .setContentIntent(contentIntent)   // the intent to send when the entry is clicked 
       .setOngoing(true)       // make persistent (disable swipe-away) 
       .build(); 

     // Start service in foreground mode 
     startForeground(NOTIFICATION, notification); 

     return START_STICKY; 
    } 


    @Override 
    public void onDestroy(){ 
     isRunning = false; 
     instance = null; 

     notificationManager.cancel(NOTIFICATION); // Remove notification 

     super.onDestroy(); 
    } 


    public void doSomething(){ 
     Toast.makeText(getApplicationContext(), "Doing stuff from service...", Toast.LENGTH_SHORT).show(); 
    } 

} 

All Service tut, ist zeigt eine Benachrichtigung an, wenn sie ausgeführt wird, und sie kann Toasts anzeigen, wenn ihre Methode doSomething() aufgerufen wird.

Wie Sie bemerken werden, ist es als singleton implementiert, verfolgt seine eigene Instanz - aber ohne die übliche statische Singleton Factory-Methode, weil Dienste natürlich Singletons sind und durch Intents erstellt werden. Die Instanz ist nach außen nützlich, um einen "Handle" für den Dienst zu erhalten, wenn er ausgeführt wird.

Last, müssen wir den Service aus einer Tätigkeit starten und zu stoppen:

public void startOrStopService(){ 
    if(RecordingService.isRunning){ 
     // Stop service 
     Intent intent = new Intent(this, RecordingService.class); 
     stopService(intent); 
    } 
    else { 
     // Start service 
     Intent intent = new Intent(this, RecordingService.class); 
     startService(intent); 
    } 
} 

In diesem Beispiel ist der Dienst gestartet wird und nach dem gleichen Verfahren gestoppt, je nach seinem aktuellen Zustand.

Wir können auch die doSomething() Methode unserer Aktivität aufrufen:

public void makeServiceDoSomething(){ 
    if(RecordingService.isRunning) 
     RecordingService.instance.doSomething(); 
}