Veja nesse artigo como criar um framework MVC (Model-View-Controller) para Android, melhorando assim o desenvolvimento nessa plataforma.
Hoje em dia a demanda de desenvolvimento de aplicativos móveis é muito alta. Para ser competitivo, um aplicativo móvel deve ser eficaz em termos de custos e ser de boa qualidade.
A escolha da arquitetura é importante para garantir a qualidade da aplicação a longo tempo e para reduzir o tempo de desenvolvimento.
O desenvolvimento iOS é baseado no Model-View-Controller e é bem estruturado. O sistema Android não requer qualquer modelo: a escolha da arquitetura e a qualidade da aplicação dependem muito da experiência do desenvolvedor.
Soluções heterogêneas desaceleram o desenvolvedor, enquanto o padrão de design conhecido não só poderia aumentar o tempo de desenvolvimento, mas melhorar a capacidade de manutenção, extensibilidade e o desempenho da aplicação.
MVC (Model-View-Controller) é um padrão de projeto de software que separa a interface do usuário (View) e das regras de negócio e dados (Model) usando um mediador (Controller) para conectar o modelo à view.
O principal benefício do MVC para nós é a separação de interesses. Cada parte do MVC cuida de seu próprio trabalho: a view cuida da interface com o usuário, o modelo se encarrega dos dados, e o controlador envia mensagens entre os dois.
O controlador fornece os dados do modelo para a view se ligar a interface do usuário. Quaisquer alterações ao controlador são transparentes para a view e as mudanças de interface do usuário não afetarão a lógica de negócios e vice-versa.
Os padrões de design ajudam a impor uma estrutura sobre os desenvolvedores para que o código se torne mais controlado e menos propenso a cair em desuso. A separação do MVC de interesses torna muito mais fácil para adicionar unidades de testes.
O Android já utiliza um padrão MVC com os arquivos XML agindo como a view. Contudo, isto não nos fornece quaisquer possibilidades reais de separação de interesses.
Para demonstrar o MVC (Model-View-Controller) framework para Android, criaremos um exemplo de tela que contém o logo da DEVMEDIA, conforme mostrado na Figura 1, e outra tela que contém um campo para digitar determinada tarefa a realizar e um botão de Nova Tarefa. Ao pressionar o botão, o valor da tarefa será incluído no banco de dados e na lista de tarefas a realizar. Ao selecionar algum item da lista, o mesmo será excluído do banco de dados, conforme mostrado na Figura 2.
Figura 1. Tela Splash
A seguir, podemos visualizar a classe que atua como Model da aplicação, conforme mostrado na Listagem 1.
Nota: O Android tem integração com o SQLite, um leve e poderoso banco de dados, permitindo que você utilize banco de dados normalmente e sua aplicação. Um banco de dados é visível somente à aplicação que o criou. A classe SQLiteHelper encapsula toda a lógica de criação de um banco. Os métodos onCreate e onUpgrade são chamados automaticamente pelo Android quando o banco precisa ser criado pela primeira vez ou ao ser atualizado devido a uma nova versão.
Listagem 1. mvcModel.java
package com.devmedia.mvc;
final class mvcModel
private static final String DB_NAME = "tarefas_db";
private static final String TABLE_NAME = "tarefa";
private static final String DB_CREATE_QUERY = "CREATE TABLE " +
mvcModel.TABLE_NAME + " (id integer primary key autoincrement,
titulo text not null);";
public mvcModel(final Context ctx)
this.helper = new SQLiteOpenHelper(ctx, mvcModel.DB_NAME,
null, mvcModel.DB_VERSION)
db.execSQL(mvcModel.DB_CREATE_QUERY);
public void onUpgrade(final SQLiteDatabase db,
final int oldVersion, final int newVersion)
db.execSQL("DROP TABLE IF EXISTS " + mvcModel.TABLE_NAME);
this.database = this.helper.getWritableDatabase();
public void addTarefa(ContentValues data)
this.database.insert(mvcModel.TABLE_NAME, null, data);
public void deleteTarefa(final String field_params)
this.database.delete(mvcModel.TABLE_NAME, field_params, null);
public Cursor loadAllTarefas()
Log.d(mvcView.APP_TAG, "loadAllTarefas()");
final Cursor c = this.database.query(mvcModel.TABLE_NAME,
new String[] { "titulo" }, null, null, null, null, null);
A seguir podemos visualizar a classe que atua como View da aplicação, conforme mostrado na Listagem 2.
Listagem 2. mvcView.java
import com.devmedia.mvc.R;
public class mvcView extends Activity
public static final String APP_TAG = "com.devmedia.mvc";
private ListView lvTarefa;
private Button btNovaTarefa;
private EditText etNovaTarefa;
private mvcController controller;
public void onCreate(final Bundle bundle)
this.setContentView(R.layout.ui_main);
this.controller = new mvcController(this);
this.lvTarefa = (ListView) this.findViewById(R.id.lvTarefa);
this.btNovaTarefa = (Button) this.findViewById(R.id.btNovaTarefa);
this.etNovaTarefa = (EditText)
this.findViewById(R.id.etNovaTarefa);
this.btNovaTarefa.setOnClickListener(this.handleNovaTarefaEvent);
this.populaTarefas();
private void populaTarefas()
final List<String> tarefas = this.controller.getTarefas();
Log.d(mvcView.APP_TAG, String.format("%d tarefas encontradas ",
tarefas.size()));
this.lvTarefa.setAdapter(new ArrayAdapter<String>
(this, android.R.layout.simple_list_item_1,
tarefas.toArray(new String[] {})));
this.lvTarefa.setOnItemClickListener(new OnItemClickListener()
public void onItemClick(final AdapterView<?> parent,
final View view, final int position, final long id)
Log.d(mvcView.APP_TAG, String.format("tarefa id: %d
e posição: %d", id, position));
final TextView v = (TextView) view;
mvcView.this.controller.deleteTarefa
(v.getText().toString());
mvcView.this.populaTarefas();
private final OnClickListener handleNovaTarefaEvent =
Log.d(APP_TAG, "botão nova tarefa acionado");
mvcView.this.controller.addTarefa(mvcView.this
.etNovaTarefa.getText().toString());
O Controller liga a interface do usuário com os dados, mas também cria uma camada de separação entre o Model e a View. Esta interface entre as duas camadas fornece uma estrutura para o código expandir.
A seguir podemos visualizar a classe que atua como Controller da aplicação, conforme mostrado na Listagem 3.
Listagem 3. mvcController.java
private List<String> tarefas;
public mvcController(Context app_context)
tarefas = new ArrayList<String>();
model = new mvcModel(app_context);
public void addTarefa(final String titulo)
final ContentValues data = new ContentValues();
data.put("titulo", titulo);
model.addTarefa(data);
public void deleteTarefa(final String titulo)
model.deleteTarefa("titulo='" + titulo + "'");
public void deleteTarefa(final long id)
model.deleteTarefa("id='" + id + "'");
public void deleteAllTarefa()
model.deleteTarefa(null);
public List<String> getTarefas()
Cursor c = model.loadAllTarefas();
tarefas.clear();
while (c.isAfterLast() == false)
tarefas.add(c.getString(0));
Uma tela splash screen deve permanecer aberta por determinado tempo para que a aplicação consiga realizar algum processamento inicial. Enquanto isso, o usuário pode ficar observando uma imagem ou mensagem na tela.
A seguir podemos visualizar a classe que atua como tela Splash da aplicação, conforme mostrado na Listagem 4.
Listagem 4. mvcSplash.java
public class mvcSplash extends Activity
setContentView(R.layout.ui_splash);
("com.devmedia.mvc.mvcView");
O arquivo AndroidManifest.xml é a base de uma aplicação Android. Ele é obrigatório e deve ficar na pasta raiz do projeto, contendo todas as configurações necessárias para executar a aplicação.
A seguir podemos visualizar o arquivo AndroidManifest, conforme mostrado na Listagem 5.
Listagem 5. AndroidManifest.xml
package="com.devmedia.mvc"
android:name="com.devmedia.mvc.mvcView">
<action android:name="com.devmedia.mvc.mvcView" />
<activity android:name=".mvcSplash">
O Android é bastante flexível em relação à criação da interface gráfica e permite que a tela seja criada em XML ou diretamente pelo código-fonte utilizando a API Java. Separando a criação da tela em um arquivo XML, seu código fica mais limpo. A seguir, podemos visualizar os arquivos de layout de tela, conforme mostrado nas Listagens 6 e 7.
Listagem 6. ui_main.xml
android:layout_below="@+id/lvTarefa"
android:id="@+id/etNovaTarefa"
android:id="@+id/btNovaTarefa"
android:text="@string/add_button_name" >
android:id="@+id/lvTarefa"
Listagem 7. ui_splash.xml
android:id="@+id/placekitten"
O arquivo strings.xml contém as mensagens da aplicação para organizar os textos em um único arquivo centralizado, o que é uma boa prática de programação. Desta forma, podemos facilmente traduzir este arquivo para diversos idiomas e tornar nossa aplicação bastante internacionalizável. A seguir, podemos visualizar o arquivo strings.xml, conforme mostrado na Listagem 8.
Listagem 8: strings.xml
<string name="app_name">Criando um MVC(Model-View-Controller)
framework para Android</string>
<string name="add_button_name">Nova Tarefa</string>
Um dos problemas fundamentais com todos os tipos de software pode ser resumido no conceito de entropia, que sugere que o código ordenado naturalmente se torna desordenado ao longo do tempo. Ou em outras palavras, não importa o quão duro você tente, seu código irá gradualmente ir de um estado organizado para um estado desorganizado em que também é conhecido como altamente acoplado.