Создаем простой Launcher на Android
Главная » Создаем простой Launcher на Android

Если очень грубо определить, что такое лаунчер, то это приложение, которое может представлять домашний экран устройства и показывать список работающих на устройстве приложений. Другими словами, лаунчер это то, что вы видите при нажатии кнопки Home на устройстве. Сейчас вы скорее всего используете стандартный лаунчер, который был установлен вместе с операционной системой. На Play Market существует множество таких программ, установив которые, вы можете видоизменить оформление своего аппарата:

Различные лаунчеры

Фактически каждый производитель смартфонов и планшетов имеет свой собственный лаунчер и стиль оформления (например, Samsung - TouchWiz, HTC - Sense). 

В этом уроке мы научимся создавать простой лаунчер с базовым пользовательским интерфейсом. В нашем приложении будет два экрана:

     - домашний экран, отображающий обои рабочего стола;

     - экран, показывающий список установленных приложений и некоторую информацию о них;

Итак, начинаем. Создаем новый проект, названия традиционно оставляем по умолчанию, можете ввести какие нибудь свои. Минимальная версия для запуска приложения - Android 2.2, выбираем Blank Activity

Сразу идем редактировать файл манифест приложения. Нам нужно добавить здесь 2 activity и задать им некоторые настройки. Открываем файл AndroidManifest.xml и добавим туда следующее:

<activity
 android:name="ah.hathi.simplelauncher.HomeActivity"
 android:label="Simple Launcher Home"
 android:theme="@android:style/Theme.Wallpaper.NoTitleBar.Fullscreen"
 android:launchMode="singleTask"
 android:stateNotNeeded="true"
 >
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.HOME" />
 <category android:name="android.intent.category.DEFAULT" />
 </intent-filter> 
</activity>

В этот код мы добавили категории android.intent.category.HOME и android.intent.category.DEFAULT для того, чтобы наше приложение вело себя как лаунчер и отображалось при нажатии на кнопку Home устройства. 

Также нужно настроить режим запуска launchMode на singleTask для того, чтобы на данный момент работает только одно нужное Activity. Для отображения пользовательской картинки на заставке, мы использовали настройку темы Theme.Wallpaper.NoTitleBar.FullScreen

Второе activity, как уже было сказано, будет отображать установленные на устройстве приложения и немного информации о них. Для этой activity не будет использоваться никаких особенных настроек, назовем ее AppsListActivity:

<activity
 android:name="ah.hathi.simplelauncher.AppsListActivity"
 android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
 > 
</activity>

Создадим xml файл разметки для будущего класса HomeActivity. В папке res/layout создаем файл по имени activity_home.xml. Он будет содержать всего одну кнопку, при нажатии на которую пользователь с домашнего экрана будет попадать на экран со списком установленных приложений:

<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"
 tools:context=".HomeActivity" >
 <Button
 android:id="@+id/apps_button"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_alignParentRight="true"
 android:layout_alignParentTop="true"
 android:layout_marginRight="10dp"
 android:layout_marginTop="10dp"
 android:text="Show Apps"
 android:onClick="showApps"
 />
 </RelativeLayout>

Далее создаем файл xml для AppsListActivity в той же папке, назовем его activity_apps_list.xml. Он будет содержать ListView для отображения списка приложений:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" >
 <ListView
 android:id="@+id/apps_list"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 > 
 </ListView> 
 </LinearLayout>

Создаем еще один xml файл по имени list_item.xml. Этот файл будет определять вид заданного выше ListView. Каждый пункт списка будет представлять одно установленное на устройство приложение. Здесь будет отображаться иконка, название и имя пакета приложения. Отображение иконки будет происходить через элемент ImageView, а имя приложения и пакета в TextView:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:padding="10dp"
 >
 <ImageView
 android:id="@+id/item_app_icon"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_alignParentLeft="true"
 android:layout_centerVertical="true" 
 />
 <TextView
 android:id="@+id/item_app_label"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_toRightOf="@+id/item_app_icon"
 android:paddingLeft="10dp"
 />
 <TextView
 android:id="@+id/item_app_name"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_below="@+id/item_app_label"
 android:layout_toRightOf="@+id/item_app_icon"
 android:paddingLeft="10dp"
 />
 </RelativeLayout>

Теперь нужно создать необходимые java классы. Когда будете создавать классы, убедитесь, что они связаны с данными в файле манифеста, что мы выполняли в начале.

Создаем в приложении файл HomeActivity.java, задаем ему наследование от класса Activity и настраиваем переход на другой экран со списком приложений при нажатии на кнопку, созданную нами ранее (подробный урок по созданию перехода):

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
 
public class HomeActivity extends Activity {
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_home);
 }
 
 public void showApps(View v){
 Intent i = new Intent(this, AppsListActivity.class);
 startActivity(i);
 }
}

Создаем еще одно activity с именем AppsListActivity.java. Настроим этому классу вид интерфейса с ранее созданного файла activity_apps_list.xml:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
 
public class AppsListActivity extends Activity {
 
 @Override
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_apps_list);
 }
}

Уже сейчас можно попробовать протестировать приложение на эмуляторе/устройстве. Пока, что оно не обладает желаемым функционалом, но все же. Запустите приложение и нажмите кнопку Home, вы увидите окно в котором вам будет предложено выбрать лаунчер для запуска, стандартный и наш. Запускаем наш и видим примерно следующее:

Вид программы

Мы видим заставку рабочего стола и нашу кнопку запуска второго activity. 

Полюбовались и хватит, возвращаемся к работе в Android Studio. Создаем еще один класс по имени AppDetail, который будет содержать более детальную информацию о приложении, название пакета, имя приложения и иконку. Код этого класса предельно простой и выглядит так:

import android.graphics.drawable.Drawable;
 
public class AppDetail {
 CharSequence label;
 CharSequence name;
 Drawable icon;
}

В методе loadApps класса AppsListActivity мы используем метод queryIntentActivities, он нужен для того, чтобы выбрать все объекты Intent, которые имеют категорию Intent.CATEGORY_LAUNCHER. Запрос будет возвращать список приложений, которые могут быть запущены нашим лаунчером. Мы запускаем цикл по результатам запроса и создаем и добавляем каждый его пункт в список по имени apps. Чтобы реализовать все сказанное, добавляем следующий код:

private PackageManager manager;
private List<AppDetail> apps; 
private void loadApps(){
 manager = getPackageManager();
 apps = new ArrayList<AppDetail>();
 
 Intent i = new Intent(Intent.ACTION_MAIN, null);
 i.addCategory(Intent.CATEGORY_LAUNCHER);
 
 List<ResolveInfo> availableActivities = manager.queryIntentActivities(i, 0);
 for(ResolveInfo ri:availableActivities){
 AppDetail app = new AppDetail();
 app.label = ri.loadLabel(manager);
 app.name = ri.activityInfo.packageName;
 app.icon = ri.activityInfo.loadIcon(manager);
 apps.add(app);
 }
}

Теперь нужно настроить отображение списка приложений. В созданном списке apps мы поместили все необходимые данные о приложении, теперь их надо отобразить в созданном в начале урока ListView. Для этого мы создаем ArrayAdapter и описываем метод getView, а также связываем ArrayAdapter с ListView:

private ListView list; 
private void loadListView(){
 list = (ListView)findViewById(R.id.apps_list);
 
 ArrayAdapter<AppDetail> adapter = new ArrayAdapter<AppDetail>(this, 
 R.layout.list_item, 
 apps) {
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
 if(convertView == null){
 convertView = getLayoutInflater().inflate(R.layout.list_item, null);
 }
 
 ImageView appIcon = (ImageView)convertView.findViewById(R.id.item_app_icon);
 appIcon.setImageDrawable(apps.get(position).icon);
 
 TextView appLabel = (TextView)convertView.findViewById(R.id.item_app_label);
 appLabel.setText(apps.get(position).label);
 
 TextView appName = (TextView)convertView.findViewById(R.id.item_app_name);
 appName.setText(apps.get(position).name);
 
 return convertView;
 }
 };
 
 list.setAdapter(adapter); 
}

Когда пользователь нажимает на пункты списка с приложениями, то наш лаунчер должен запускать соответствующее приложение. Это будет выполняться благодаря методу getLaunchIntentForPackage , создающего намерение Intent, запускающее нужное приложение:

private void addClickListener(){ 
 list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
 @Override
 public void onItemClick(AdapterView<?> av, View v, int pos,
 long id) {
 Intent i = manager.getLaunchIntentForPackage(apps.get(pos).name.toString());
 AppsListActivity.this.startActivity(i);
 }
 });
}

Осталось собрать все описанные выше методы в один рабочий механизм. В классе AppsListActivity вызываем методы loadApps, loadListView и addClickListener:

protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_apps_list);
 
 loadApps();
 loadListView();
 addClickListener();
}

Запускаем наше приложение. Теперь при нажатии на кнопку вызова второго activity "Show Apps" мы видим список из установленных приложений. При нажатии на выбранный элемент списка, мы будем запускать соответствующее приложение:

Запущенное работоспособное приложение

Поздравляю! Теперь в придачу до собственных калькулятора, браузера, конвертера и много другого, мы имеем еще и собственный Android Launcher. Надеюсь урок был вам интересен и полезен. 

Оригинал урока. 

Категория: Уроки программирования | Просмотров: 1890 | Добавил: Oleg | Теги: Android, Launcher, лаунчер для Android, приложение | Рейтинг: 0.0/0
Всего комментариев: 0
avatar