Статьи

Создайте кастомный лаунчер на Android

Конечный продукт
Что вы будете создавать

В своей самой основной форме, средство запуска — это приложение, которое выполняет следующие действия:

  • он представляет домашний экран устройства
  • он перечисляет и запускает приложения, которые установлены на устройстве

Другими словами, это приложение, которое появляется при нажатии кнопки «Домой». Если вы еще не установили пользовательский модуль запуска, в настоящее время вы используете модуль запуска по умолчанию, который поставляется с вашей установкой Android. Многие производители устройств имеют свои собственные стандартные пусковые установки, которые соответствуют их фирменному стилю, например, Samsung TouchWiz и HTC Sense.

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

  • домашний экран, показывающий обои устройства
  • экран, показывающий значки и информацию о приложениях, установленных на устройстве

Кстати, если вы много работаете с Android, вы можете попробовать один из 1000+ шаблонов приложений Android на Envato Market. Есть огромное разнообразие, так что вы обязательно найдете что-то там, чтобы помочь вам с вашей работой. Или вы могли бы передать области, которые не являются вашей специальностью, наняв разработчика приложений или дизайнера в Envato Studio.

Шаблоны приложений для Android на Envato Market
Шаблоны приложений для Android на Envato Market

На вашем компьютере разработки должно быть установлено и настроено следующее:

  • Android SDK и инструменты платформы
  • Eclipse IDE 3.7.2 или выше с плагином ADT
  • эмулятор или устройство Android под управлением Android 2.2 или выше

Вы можете скачать SDK и инструменты платформы на портале разработчиков Android .

Запустите Eclipse и создайте новый проект приложения для Android. Я называю приложение SimpleLauncher , но вы можете назвать его как угодно. Убедитесь, что вы используете уникальный пакет. Самая низкая версия SDK, которую поддерживает наша программа запуска, — это Froyo, а целевой SDK — Jelly Bean .

Поскольку мы не хотим создавать Activity , отмените выбор « Создать активность» . Нажмите Готово, чтобы продолжить.

Следующим шагом является изменение файла AndroidManifest.xml путем добавления двух действий. Первое действие отображает домашний экран. Давайте HomeActivity это HomeActivity как показано ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
<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 в группу intent-filter , связанное с ними действие ведет себя как средство запуска и отображается в качестве параметра при нажатии кнопки «Домой» на устройстве.

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

Второе действие, которое нам нужно добавить, отображает приложения, которые установлены на устройстве пользователя. Он также отвечает за запуск приложений. Нам не нужны никакие специальные настройки для этого Activity . Назовите его AppsListActivity .

1
2
3
4
5
<activity
    android:name=»ah.hathi.simplelauncher.AppsListActivity»
    android:theme=»@android:style/Theme.NoTitleBar.Fullscreen»
    >
</activity>

Создайте файл XML для класса HomeActivity в папке проекта res / layout и назовите его activity_home.xml . Макет имеет одну Button которая реагирует на события нажатия. Нажатие на кнопку переводит пользователя с главного экрана в список приложений.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<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 в папке проекта res / layout и назовите его activity_apps_list.xml . Макет содержит ListView который занимает весь экран.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?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 для метки и имени пакета.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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>

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

Создайте новый класс с именем HomeActivity и установите android.app.Activity качестве суперкласса.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
package ah.hathi.simplelauncher;
 
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);
    }
}

В методе класса onCreate мы вызываем setContentView , передавая макет, который мы создали ранее. Возможно, вы помните, что мы добавили кнопку в макет activity_home, которая вызывает метод с именем showApps . Теперь нам нужно реализовать этот метод в классе HomeActivity . Реализация довольно проста, мы создаем Intent для класса AppsListActivity и запускаем его.

Создайте другой класс Activity именем AppsListActivity и установите android.app.Activity качестве его суперкласса. В методе класса onCreate мы вызываем setContentView , передавая макет activity_apps_list, который мы создали ранее.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
package ah.hathi.simplelauncher;
 
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);
    }
         
}

Несмотря на то, что наша программа запуска еще не закончена, вы можете сохранить и запустить ваше приложение на этом этапе. Когда вы нажимаете домашнюю кнопку устройства, вы должны увидеть всплывающее окно с вопросом о том, какую программу запуска вы хотели бы использовать.

Если вы выбираете Simple Launcher Home , вы должны увидеть новый домашний экран с одной кнопкой в ​​правом верхнем углу экрана. Вы также должны увидеть текущие обои вашего устройства.

Вернитесь в Eclipse и создайте класс с именем AppDetail который будет содержать сведения о приложении, его имени пакета, метке и значке приложения. Интерфейс довольно простой, как вы можете видеть ниже.

1
2
3
4
5
6
7
8
9
package ah.hathi.simplelauncher;
 
import android.graphics.drawable.Drawable;
 
public class AppDetail {
        CharSequence label;
        CharSequence name;
        Drawable icon;
}

В методе AppsListActivity класса AppsListActivity мы используем метод AppsListActivity класса AppsListActivity , чтобы извлечь все Intents , имеющие категорию Intent.CATEGORY_LAUNCHER . Запрос возвращает список приложений, которые могут быть запущены средством запуска. Мы перебираем результаты запроса и добавляем каждый элемент в список с именем apps . Взгляните на следующий фрагмент кода для пояснения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
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 для визуализации элементов списка. Затем мы связываем ListView с адаптером.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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);
}

Когда пользователь щелкает элемент в ListView , наше приложение должно запустить соответствующее приложение. Мы используем метод getLaunchIntentForPackage класса getLaunchIntentForPackage чтобы создать Intent с помощью которого мы запускаем приложение. Взгляните на следующий фрагмент кода.

01
02
03
04
05
06
07
08
09
10
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);
        }
    });
}

Чтобы все работало вместе, нам нужно вызвать loadApps , loadListView и addClickListener в методе AppsListActivity класса AppsListActivity как показано ниже.

1
2
3
4
5
6
7
8
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_apps_list);
     
    loadApps();
    loadListView();
    addClickListener();
}

Создайте и запустите приложение еще раз, чтобы увидеть результат. Теперь вы сможете увидеть приложения, которые можно запустить, нажав кнопку на главном экране нашего модуля запуска. Нажмите на элемент, чтобы запустить соответствующее приложение.

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