27 February 2021
© Денис Колисниченко
Любое приложение может содержать следующие компоненты:
Приложение должно состоять как минимум из одного такого компонента. В самых сложных случаях в приложении будут присутствовать все четыре компоненты. Операционная система (и другие Android-приложения при соответствующих разрешениях) может вызывать необходимый ей компонент приложения.
Какие компоненты должны быть именно в вашем приложении, зависит от самого приложения, то есть того, что вам нужно сделать. Если нужно организовать интерфейс пользователя (например, получить от пользователя ввод), тогда в вашем приложении обязательно должна быть деятельность (Activity).
При разработке фонового процесса, например, для воспроизведения музыки или фонового обновления деятельности, вам пригодится служба (Service).
Для обращения к ресурсам телефона, например, доступа к контактам телефона, вам нужен контент-провайдер (Content-Provider). Для получения же широковещательных сообщений (с целью реакции на какие-то события телефона) используется BroadcastReceiver.
Намерение (Intent) — это действие. Компоненты приложения вызываются с помощью намерений. Например, вы можете вызвать браузер с помощью намерения:
Intent Mybrowser = Intent(Intent.ACTION_VIEW);
Mybrowser.setData(Uri.parse("https://www.google.com"));
startActivity(Mybrowser);
Аналогично, вы можете вызвать компонент своего собственного приложения. Пусть у вас есть приложение, в котором имеется две (или более) деятельности (два или более окна). Вызвать вспомогательное окно можно только с помощью намерения.
Представим, что вы разрабатываете приложение, в котором есть меню. В меню есть кнопка Start, которая запускает другую деятельность в главном окне. Обработчик нажатия кнопки Start будет таким:
Intent startButton = new Intent(this, StartButton.class);
startActivity(startButton);
В нашем проекте должен быть класс StartButton. "Болванка" для этого класса приведена в листинге 1. Наш класс ничего не делает — он просто находит в файле разметки деятельности кнопку the_end и устанавливает для нее обработчик — функцию finish(). Напомню, чтобы добавить класс StartButton в проект, нужно щелкнуть на проекте (в области Package Explorer) правой кнопкой мыши и выберите команду New, Class.
Листинг 1. Файл StartButton.java
package com.samples.startgame;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class StartButton extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// файл разметки называется app.xml
setContentView(R.layout.app);
// обработка кнопки завершения программы
Button endButton = (Button) findViewById(R.id.the_end);
endButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
finish();
}
});
}
}
Файл разметки для деятельности StartButton представлен в листинге 2.
Листинг 2. Файл разметки для деятельности StartButton (res/layout/app.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button android:id="@+id/the_end"
android:layout_width="100dip"
android:layout_height="100dip"
android:text="@string/the_end"
android:layout_centerInParent="true"
/>
</LinearLayout>
В файле манифеста нужно зарегистрировать нашу новую деятельность и установить для нее действия — VIEW и DEFAULT (листинг 3).
Листинг 3. Файл манифеста для приложения с несколькими деятельностями
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
package="com.samples.startbutton">
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name=".Menu"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".StartButton"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>