Android - Serviços
UMA serviceé um componente executado em segundo plano para realizar operações de longa duração sem a necessidade de interagir com o usuário e funciona mesmo se o aplicativo for destruído. Um serviço pode ter essencialmente dois estados -
Sr. Não. | Estado e descrição |
---|---|
1 | Started Um serviço é startedquando um componente do aplicativo, como uma atividade, o inicia chamando startService () . Depois de iniciado, um serviço pode ser executado em segundo plano indefinidamente, mesmo se o componente que o iniciou for destruído. |
2 | Bound Um serviço é boundquando um componente de aplicativo se liga a ele chamando bindService () . Um serviço vinculado oferece uma interface cliente-servidor que permite que os componentes interajam com o serviço, enviem solicitações, obtenham resultados e até mesmo façam isso em processos com comunicação entre processos (IPC). |
Um serviço tem métodos de retorno de chamada do ciclo de vida que você pode implementar para monitorar as mudanças no estado do serviço e pode executar o trabalho no estágio apropriado. O diagrama a seguir à esquerda mostra o ciclo de vida quando o serviço é criado com startService () e o diagrama à direita mostra o ciclo de vida quando o serviço é criado com bindService (): (cortesia de imagem: android.com)
Para criar um serviço, você cria uma classe Java que estende a classe base Service ou uma de suas subclasses existentes. oServiceA classe base define vários métodos de retorno de chamada e os mais importantes são fornecidos a seguir. Você não precisa implementar todos os métodos de retorno de chamada. No entanto, é importante que você entenda cada um e implemente aqueles que garantem que seu aplicativo se comporte da maneira que os usuários esperam.
Sr. Não. | Retorno de chamada e descrição |
---|---|
1 | onStartCommand() O sistema chama esse método quando outro componente, como uma atividade, solicita que o serviço seja iniciado, chamando startService () . Se você implementar esse método, é sua responsabilidade interromper o serviço quando seu trabalho for concluído, chamando os métodos stopSelf () ou stopService () . |
2 | onBind() O sistema chama esse método quando outro componente deseja se vincular ao serviço chamando bindService () . Se você implementar este método, deverá fornecer uma interface que os clientes usam para se comunicar com o serviço, retornando um objeto IBinder . Você deve sempre implementar esse método, mas se não quiser permitir a vinculação, deverá retornar nulo . |
3 | onUnbind() O sistema chama esse método quando todos os clientes se desconectam de uma interface específica publicada pelo serviço. |
4 | onRebind() O sistema chama este método quando novos clientes se conectam ao serviço, após terem sido previamente notificados que todos haviam se desconectado em seu onUnbind (Intent) . |
5 | onCreate() O sistema chama esse método quando o serviço é criado pela primeira vez usando onStartCommand () ou onBind () . Esta chamada é necessária para realizar uma configuração única. |
6 | onDestroy() O sistema chama esse método quando o serviço não é mais usado e está sendo destruído. Seu serviço deve implementar isso para limpar quaisquer recursos, como threads, ouvintes registrados, receptores, etc. |
O seguinte esqueleto de serviço demonstra cada um dos métodos de ciclo de vida -
package com.tutorialspoint;
import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.os.Bundle;
public class HelloService extends Service {
/** indicates how to behave if the service is killed */
int mStartMode;
/** interface for clients that bind */
IBinder mBinder;
/** indicates whether onRebind should be used */
boolean mAllowRebind;
/** Called when the service is being created. */
@Override
public void onCreate() {
}
/** The service is starting, due to a call to startService() */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return mStartMode;
}
/** A client is binding to the service with bindService() */
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
/** Called when all clients have unbound with unbindService() */
@Override
public boolean onUnbind(Intent intent) {
return mAllowRebind;
}
/** Called when a client is binding to the service with bindService()*/
@Override
public void onRebind(Intent intent) {
}
/** Called when The service is no longer used and is being destroyed */
@Override
public void onDestroy() {
}
}
Exemplo
Este exemplo o levará por etapas simples para mostrar como criar seu próprio serviço Android. Siga as etapas a seguir para modificar o aplicativo Android que criamos no capítulo de exemplo Hello World -
Degrau | Descrição |
---|---|
1 | Você usará o Android StudioIDE para criar um aplicativo Android e nomeá-lo como My Application em um pacote com.example.tutorialspoint7.myapplication, conforme explicado no capítulo Exemplo Hello World . |
2 | Modifique o arquivo de atividade principal MainActivity.java para adicionar os métodos startService () e stopService () . |
3 | Crie um novo arquivo java MyService.java sob o pacote com.example.My Application . Este arquivo terá implementação de métodos relacionados ao serviço Android. |
4 | Defina seu serviço no arquivo AndroidManifest.xml usando a tag <service ... />. Um aplicativo pode ter um ou mais serviços sem quaisquer restrições. |
5 | Modifique o conteúdo padrão do arquivo res / layout / activity_main.xml para incluir dois botões no layout linear. |
6 | Não há necessidade de alterar nenhuma constante no arquivo res / values / strings.xml . Android Studio cuida dos valores das strings |
7 | Execute o aplicativo para iniciar o emulador Android e verifique o resultado das alterações feitas no aplicativo. |
A seguir está o conteúdo do arquivo de atividade principal modificado MainActivity.java. Este arquivo pode incluir cada um dos métodos fundamentais do ciclo de vida. Adicionamos os métodos startService () e stopService () para iniciar e parar o serviço.
package com.example.tutorialspoint7.myapplication;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
public class MainActivity extends Activity {
String msg = "Android : ";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(msg, "The onCreate() event");
}
public void startService(View view) {
startService(new Intent(getBaseContext(), MyService.class));
}
// Method to stop the service
public void stopService(View view) {
stopService(new Intent(getBaseContext(), MyService.class));
}
}
A seguir está o conteúdo de MyService.java. Este arquivo pode ter implementação de um ou mais métodos associados ao Serviço com base em requisitos. Por enquanto, vamos implementar apenas dois métodos onStartCommand () e onDestroy () -
package com.example.tutorialspoint7.myapplication;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.Toast;
/**
* Created by TutorialsPoint7 on 8/23/2016.
*/
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Let it continue running until it is stopped.
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
}
A seguir, o conteúdo modificado do arquivo AndroidManifest.xml . Aqui, adicionamos a tag <service ... /> para incluir nosso serviço -
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tutorialspoint7.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyService" />
</application>
</manifest>
A seguir estará o conteúdo de res/layout/activity_main.xml arquivo para incluir dois botões -
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Example of services"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_above="@+id/imageButton"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:text="Start Services"
android:onClick="startService"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Stop Services"
android:id="@+id/button"
android:onClick="stopService"
android:layout_below="@+id/button2"
android:layout_alignLeft="@+id/button2"
android:layout_alignStart="@+id/button2"
android:layout_alignRight="@+id/button2"
android:layout_alignEnd="@+id/button2" />
</RelativeLayout>
Vamos tentar executar nosso modificado Hello World!aplicativo que acabamos de modificar. Suponho que você tenha criado o seuAVDao fazer a configuração do ambiente. Para executar o aplicativo do Android Studio, abra um dos arquivos de atividade do seu projeto e clique no ícone Executar na barra de ferramentas. O Android Studio instala o aplicativo em seu AVD e o inicia e, se tudo correr bem com sua configuração e aplicativo, ele será exibido na janela do emulador seguinte -
Agora, para iniciar seu serviço, vamos clicar em Start Service, isso iniciará o serviço e de acordo com nossa programação no método onStartCommand () , uma mensagem Service Started aparecerá na parte inferior do simulador como segue -
Para interromper o serviço, você pode clicar no botão Interromper serviço.