Секретный код для запуска Android приложения

от
Android    broadcast receiver, secret code, пасхалки, easter eggs

Вы наверняка сталкивались с секретными кодами, которые нужно вводить при наборе номера и которые открывают какие-нибудь специальные возможности. Например, *#*#4636#*#* показывает скрытое меню с информацией о телефоне, батарее и отчётом о статистике использования приложений. В устройствах Sony комбинация *#*#7378423#*#* открывает сервисное меню, где можно протестировать работу камеры, дисплея и прочих компонентов.
device-2018-10-02-171331.png device-2018-10-02-171332.pngО том, как сделать, чтобы ваше приложение реагировало на какой-нибудь код и пойдёт речь в статье.

Для начала создадим секретную активити, которая просто показывает текст.
  1. import android.content.Context;
  2. import android.content.Intent;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5.  
  6. public class SecretActivity extends AppCompatActivity {
  7.  
  8.     public static Intent newIntent(Context context) {
  9.         final Intent intent = new Intent(context, SecretActivity.class);
  10.         return intent;
  11.     }
  12.  
  13.     @Override
  14.     protected void onCreate(Bundle savedInstanceState) {
  15.         super.onCreate(savedInstanceState);
  16.         setContentView(R.layout.activity_secret);
  17.     }
  18. }
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3.        xmlns:android="http://schemas.android.com/apk/res/android"
  4.        xmlns:tools="http://schemas.android.com/tools"
  5.        android:layout_width="match_parent"
  6.        android:layout_height="match_parent"
  7.        tools:context=".SecretActivity">
  8.     <TextView
  9.            android:layout_centerHorizontal="true"
  10.            android:layout_centerVertical="true"
  11.            android:layout_width="wrap_content"
  12.            android:layout_height="wrap_content"
  13.            android:textAppearance="@style/TextAppearance.AppCompat.Large"
  14.            android:gravity="center"
  15.            android:text="@string/top_secret" />
  16. </RelativeLayout>

Теперь создаём BroadcastReceiver, который будет запускать секретную активити:
  1. import android.content.BroadcastReceiver;
  2. import android.content.Context;
  3. import android.content.Intent;
  4.  
  5. public class SecretCodeReceiver extends BroadcastReceiver {
  6.  
  7.     @Override
  8.     public void onReceive(Context context, Intent intent) {
  9.         context.startActivity(
  10.                 SecretActivity.newIntent(context)
  11.                         .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  12.         );
  13.     }
  14. }
Этот BroadcastReceiver должен реагировать на действие "android.provider.Telephony.SECRET_CODE", прописываем его в AndroidManifest.xml:
  1. <receiver android:name=".SecretCodeReceiver">
  2.     <intent-filter>
  3.         <action android:name="android.provider.Telephony.SECRET_CODE" />
  4.         <data android:scheme="android_secret_code" android:host="3228" />
  5.     </intent-filter>
  6. </receiver>
В android:host указывается секретный код. В данном случае при наборе *#*#3228#*#* будет запущен SecretCodeReceiver, который запустит SecretActivity.

Из-за ограничения системы BroadcastReceiver не может быть активирован непосредственно после установки приложения — требуется хотя бы раз запустить приложение. Поэтому нужно создать ещё и главную активити:
  1. import android.support.v7.app.AppCompatActivity;
  2. import android.os.Bundle;
  3.  
  4. public class MainActivity extends AppCompatActivity {
  5.  
  6.     @Override
  7.     protected void onCreate(Bundle savedInstanceState) {
  8.         super.onCreate(savedInstanceState);
  9.         setContentView(R.layout.activity_main);
  10.     }
  11. }
Не забываем зарегистрировать активити в манифесте:
  1. <application
  2.        android:allowBackup="true"
  3.        android:icon="@mipmap/ic_launcher"
  4.        android:label="@string/app_name"
  5.        android:roundIcon="@mipmap/ic_launcher_round"
  6.        android:supportsRtl="true"
  7.        android:theme="@style/AppTheme">
  8.     <activity android:name=".MainActivity" >
  9.         <intent-filter>
  10.             <action android:name="android.intent.action.MAIN"/>
  11.  
  12.             <category android:name="android.intent.category.LAUNCHER"/>
  13.         </intent-filter>
  14.     </activity>
  15.     <activity android:name=".SecretActivity" />
  16.     <receiver android:name=".SecretCodeReceiver">
  17.         <intent-filter>
  18.             <action android:name="android.provider.Telephony.SECRET_CODE" />
  19.             <data android:scheme="android_secret_code" android:host="3228" />
  20.         </intent-filter>
  21.     </receiver>
  22. </application>

И вот демонстрация работы
Исходный код проекта: GitHub
Приложение: app-release.apk
  • +10
  • views 6037