FAQ по программированию под Android от новичка, и для новичков

от автора

Предисловие к FAQ.

Программирование является моим хобби уже давно (правда на других языках и платформах), но до андроида руки дотянулись совсем недавно. Прошло несколько этапов, прежде чем я добрался до написания программ.
Сначала была пара месяцев посвященных Java, на сайте с «Сгибателем».
После, долгие попытки подружится с Eclipse, закончившиеся побегом на Android Studio.
На данный момент выпущено 7 программ и две находятся в разработке.
Данная подборка возникла как попытка структурирования и оптимизации полученной в процессе информации.
Заранее извиняюсь за возможно некорректную терминологию – так как практикую обучение через создание, и в теоретической части есть пробелы.

Надеюсь, что приведенные примеры окажутся полезными.

Как явно программно закрыть приложение при нажатии по кнопке:

finish();

Выход с большей вероятностью (api 15+)

 Intent intent = new Intent(Activity.this, Activity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); finish(); 

Либо прописываем в AndroidManifest.xml — android:noHistory=«true»

Данные настройки позволяют избежать гуляния по предыдущим активностям вместо выхода.

Как использовать мелодии и вибрацию:

Пример кода:

 Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); try {                         MediaPlayer mp = MediaPlayer.create(context.getApplicationContext(), alert);                         mp.setVolume(100, 100);                         mp.start();                         mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {                             @Override                             public void onCompletion(MediaPlayer mp) {                                 mp.release();                             }                         });                      } catch (Exception e) {                         Toast.makeText(context, "Error default media ", Toast.LENGTH_LONG).show();                     } 

Что бы звук не был тихим: stackoverflow.com/questions/8278939/android-mediaplayer-volume-is-very-low-already-adjusted-volume

Для вибрации необходимо прописать в манифесте

<uses-permission android:name="android.permission.VIBRATE" /> 

Сам код:

 vibrator = (Vibrator) getSystemService (VIBRATOR_SERVICE); vibrator.vibrate(400); 

Работа с текстом:

Цвет:

 builder.setMessage(Html.fromHtml("<font color='#FF0000'><b>John:</b></font>"+"How are you?")) 

Выравнивание текста диалога:
stackoverflow.com/questions/3965122/android-how-to-align-message-in-alertdialog

Форматирование текста:
stackoverflow.com/questions/3235131/set-textview-text-from-html-formatted-string-resource-in-xml

Тень на тексте:

 textv.setShadowLayer(1, 0, 0, Color.BLACK); 

Как сменить активити:

 Intent intent = new Intent(MainActivity.this, Level002Activity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // Если не хотим сохранять историю startActivity(intent); 

Простой шаблон обработки нажатий:

1. В строчку public class MyActivity extends Activity дописываем implements View.OnClickListener, получается следующее:

 public class MyActivity extends Activity implements View.OnClickListener { 

2. Объявляем переменную Button btn;
3. В onCreate прописываем

 btn =(Button) findViewById(R.id.btn); btn.setOnClickListener(this); 

4. Создаем процедуру:

 public void onClick(View v) {         // по id определеяем кнопку, вызвавшую этот обработчик         switch (v.getId()) {             case R.id.btn:                 //Прописываем действие по нажатию                  break;         }     } 

Вывод всплывающего сообщения:

 Toast.makeText(this, "Текст сообщения", Toast.LENGTH_SHORT).show(); 

Установка прозрачности на Активити:

stackoverflow.com/questions/2176922/how-to-create-transparent-activity-in-android

android:theme="@android:style/Theme.Translucent.NoTitleBar" 

Вызов диалога:

startandroid.ru/ru/uroki/vse-uroki-spiskom/119-urok-60-dialogi-alertdialog-title-message-icon-buttons.html
Пример кода:

 protected Dialog onCreateDialog(int id) {         if (id == DIALOG_EXIT) {             AlertDialog.Builder adb = new AlertDialog.Builder(this);             // заголовок             adb.setTitle(R.string.Help);             // сообщение             // adb.setMessage(R.string.HelperD);             adb.setMessage(this.getResources().getText(R.string.helpMain));             // иконка             adb.setIcon(R.drawable.ic_launcher);             // кнопка положительного ответа             adb.setPositiveButton( getResources().getString(R.string.close),myClickListener);             // кнопка отрицательного ответа              return adb.create();         }         return super.onCreateDialog(id);     }      DialogInterface.OnClickListener myClickListener = new DialogInterface.OnClickListener() {         public void onClick(DialogInterface dialog, int which) {             switch (which) {                 // положительная кнопка                 case Dialog.BUTTON_POSITIVE:                     //  saveData();                    // Intent intent = new Intent(MyActivity.this, MyActivity.class);                   //  startActivity(intent);                     // finish();                     break;              }         }     }; 

Вызов: showDialog(DIALOG_EXIT);

Получить строку из ресурсов:

 String mess = getResources().getString(R.string.mess_1); 

Ловля исключений:

stackoverflow.com/questions/5984507/sharedpreferences-getintcumulative-0-catch-22-how-to-resolve
habrahabr.ru/post/129582/

Код выглядит так:

   try { // Выполняется  }  catch (Exception e) {             // исключение          } 

Получение формата времени на устройстве 24/12:

 android.text.format.DateFormat.is24HourFormat(context) 

muratonnet.blogspot.ru/2013/08/when-i-was-developing-date-time-picker.html

Обращение к ресурсам:

 getResources().getColor(R.color.errorColor) 

Округление Float:

Очистка стэка:

stackoverflow.com/questions/7075349/android-clear-activity-stack

Пример Кода:

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

Работа с уведомлениями:

startandroid.ru/ru/uroki/vse-uroki-spiskom/164-urok-99-service-uvedomlenija-notifications.html
developer.android.com/design/patterns/notifications.html
developer.android.com/guide/topics/ui/notifiers/notifications.html

Для api<16

 void sendNotif(Context context) {         nm = (NotificationManager) 	context.getSystemService(context.NOTIFICATION_SERVICE);                 String msgText = "Текст Сообщения";          Notification notif = new Notification(R.drawable.ic_launcher, "Статус строка сообщения",                 System.currentTimeMillis());          Intent intent = new Intent(context, options.class);         intent.putExtra(MyActivity.FILE_NAME, "somefile");         PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent, 0);          notif.setLatestEventInfo(context, "Статус строка сообщения", msgText, pIntent);           // ставим флаг, чтобы уведомление пропало после нажатия         notif.flags |= Notification.FLAG_AUTO_CANCEL;          // отправляем, цифра ID сообщения.         nm.notify(1, notif);      } //Для api>15       void sendNotif16(Context context) {                  String msgText =  "Текст Сообщения";          NotificationManager notificationManager =getNotificationManager(context);         PendingIntent pi = getPendingIntent(context);        Notification.Builder builder = new Notification.Builder(context);         builder.setContentTitle("NotificationTitle")                 .setContentText("Текст отображаемый в свернутом виде")                 .setSmallIcon(R.drawable.ic_launcher)                 .setAutoCancel(true)         .setPriority(Notification.PRIORITY_HIGH) .addAction(R.drawable.ic_launcher,context.getResources().getString(R.string.NotificationButton), pi);         Notification notification = new Notification.BigTextStyle(builder)                 .bigText(msgText).build();          notificationManager.notify(1, notification);     } public NotificationManager getNotificationManager(Context context) {         return (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);     }  //Вызов: if (Build.VERSION.SDK_INT < 16) {                         sendNotif(context);                     } else {                         sendNotif16(context);                     }  //Отмена  public static void CancelNotification(Context ctx, int notifyId) {         String ns = Context.NOTIFICATION_SERVICE;         NotificationManager nMgr = (NotificationManager) ctx.getSystemService(ns);         nMgr.cancel(notifyId);     } 

Держать экран включенным

stackoverflow.com/questions/5331152/correct-method-for-setkeepscreenon-flag-keep-screen-on

Пример кода:

В XML android:keepScreenOn=«true» или в программе:

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

Android эмулятор:

www.genymotion.com/
Лучшее из того что встречал, не всегда стабильно, но быстро.
Создаем таблицу:

stackoverflow.com/questions/13189790/how-to-draw-horizontal-and-vertical-line-in-table-layout

Пример кода:

 TableLayout table = (TableLayout) findViewById(R.id.score_table);          // create a new TableRow         TableRow row = new TableRow(this);           // create a new TextView         TextView t = new TextView(this);          t.setBackgroundResource(R.drawable.cell_shape);         t.setPadding(5,5,5,5);          View view_instance = (View)findViewById(R.id.txt1);         ViewGroup.LayoutParams params=view_instance.getLayoutParams();          t.setLayoutParams(params);          t.setText(data) ;         t.setTextColor(getResources().getColor(R.color.windowBackground));      row.addView(t);  table.addView(row,new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT, TableLayout.LayoutParams.FILL_PARENT));  

Обработка нажатия кнопки назад (Back Pressed):

stackoverflow.com/questions/3141996/android-how-to-override-the-back-button-so-it-doesnt-finish-my-activity

Пример кода:

 public void onBackPressed() {          Intent intent = new Intent(Activity1.this, Activity2.class);         startActivity(intent);         super.onBackPressed();     }    

Сдвигаем Активность при вводе текста

Перемещение фокуса с EditText:

stackoverflow.com/questions/17989733/move-to-another-edittext-when-soft-keyboard-next-is-clicked-on-android
Используем в XML

android:imeOptions="actionNext" 

для завершения

android:imeOptions="actionDone" 

Временный запрет смены ориентации активити:

stackoverflow.com/questions/3611457/android-temporarily-disable-orientation-changes-in-an-activity
stackoverflow.com/questions/2795833/check-orientation-on-android-phone/10453034#10453034
stackoverflow.com/questions/3611457/android-temporarily-disable-orientation-changes-in-an-activity

Такое использовать не рекомендуется, но если надо.
Вот пример относительно стабильной реализации:

 private static void disableRotation(Activity activity)     {         WindowManager windowManager =  (WindowManager) 	activity.getSystemService(Context.WINDOW_SERVICE);      	   Configuration configuration = activity.getResources().getConfiguration();       		  int rotation = windowManager.getDefaultDisplay().getRotation();          // Search for the natural position of the device         if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&                 (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) ||                 configuration.orientation == Configuration.ORIENTATION_PORTRAIT &&                         (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270))         {             // Natural position is Landscape             switch (rotation)             {                 case Surface.ROTATION_0:                     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);                     break;                 case Surface.ROTATION_90:                     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);                     break;                 case Surface.ROTATION_180:                     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);                     break;                 case Surface.ROTATION_270:                     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);                     break;             }         }         else         {             // Natural position is Portrait             switch (rotation)             {                 case Surface.ROTATION_0:                     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);                     break;                 case Surface.ROTATION_90:                     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);                     break;                 case Surface.ROTATION_180:                     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);                     break;                 case Surface.ROTATION_270:                     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);                     break;             }         }             }      private static void enableRotation(Activity activity)     {         activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);              } 

Использование AlarmManager для напоминаний:

www.mobilab.ru/androiddev/androidalarmmanagertutorial.html
stackoverflow.com/questions/3052149/using-alarmmanager-to-start-a-service-at-specific-time
developer.android.com/reference/android/app/AlarmManager.html
stackoverflow.com/questions/2844274/multiple-calls-to-alarmmanager-setrepeating-deliver-the-same-intent-pendinginten

Возобновление после перезагрузки:
stackoverflow.com/questions/12512717/android-alarmmanager-after-reboot
github.com/commonsguy/cw-omnibus/blob/master/AlarmManager/Scheduled/src/com/commonsware/android/schedsvc/PollReceiver.java
stackoverflow.com/questions/4315611/android-get-all-pendingintents-set-with-alarmmanager
Пример кода с вызовом после перезагрузки (не оптимальный нужно дорабатывать):
В манифесте прописываем:

 <uses-permission android:name="android.permission.WAKE_LOCK"/>     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <receiver android:name=".BootReceiver">             <intent-filter>                 <action android:name="android.intent.action.BOOT_COMPLETED" />                 <category android:name="android.intent.category.HOME" />             </intent-filter>         </receiver>          <receiver android:name=".AlarmManagerBroadcastReceiver">         </receiver> 

 BootReceiver.java public class BootReceiver extends BroadcastReceiver {           @Override     public void onReceive(Context context, Intent intent) {         AlarmManagerBroadcastReceiver.setTime=3;         PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);         PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "EyeGuard");         SetAlarm(context);      }     }      public void SetAlarm(Context context)     {         //Toast.makeText(context, "SetAlarm", 10).show();         AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);         Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);         intent.putExtra(AlarmManagerBroadcastReceiver.ONE_TIME, Boolean.FALSE);         PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);         //After after 30 seconds         am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * AlarmManagerBroadcastReceiver.setTime *60 , pi); /// 1000     }      public void CancelAlarm(Context context)     {        // Toast.makeText(context, "CancelAlarm", Toast.LENGTH_LONG).show();         Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);         PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);         AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);         alarmManager.cancel(sender);     }   }  AlarmManagerBroadcastReceiver.java public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {      @Override     public void onReceive(Context context, Intent intent) {  AlarmManagerBroadcastReceiver.setTime=3; PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "EyeGuard"); wl.acquire(10000); //Засыпает через 10 секунд                      //Здесь свой код                     //     }         public void SetAlarm(Context context)     {                AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);         Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);         intent.putExtra(ONE_TIME, Boolean.FALSE);         PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);                am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000  *setTime *setTime2 , pi); /// 1000  *25   *60     }      public void CancelAlarm(Context context)     {                 Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);         PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);         AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);         alarmManager.cancel(sender);     }     public void setOnetimeTimer(Context context){                AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);         Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);         intent.putExtra(ONE_TIME, Boolean.TRUE);         PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);         am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);     } } 

В активити из которой вызываем
Прописываем private AlarmManagerBroadcastReceiver alarm;
В onCreate:

 alarm = new AlarmManagerBroadcastReceiver(); 

Добавляем процедуры:

 public void startRepeatingTimer(View view) {         //   Toast.makeText(this, "startRepeatingTimer", 30).show();         Context context = this.getApplicationContext();         if(alarm != null){             alarm.SetAlarm(context);         }else{             //Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show();         }     }      public void cancelRepeatingTimer(View view){         //  Toast.makeText(this, "cancelRepeatingTimer", 30).show();         Context context = this.getApplicationContext();         if(alarm != null){             alarm.CancelAlarm(context);         }else{            // Toast.makeText(context, "Alarm is null", Toast.LENGTH_SHORT).show();         }     } 

Вызов осуществляем:
startRepeatingTimer(v);
Отменяем:
cancelRepeatingTimer(v);

Включение экрана из программы:

developer.android.com/reference/android/os/PowerManager.html
stackoverflow.com/questions/18679455/in-android-how-can-i-turn-off-the-screen-programatically
pastebin.com/RyjTF08K
stackoverflow.com/questions/13696891/programmatically-set-screen-to-off-in-android
forum.xda-developers.com/showthread.php?t=1210421
developer.android.com/reference/android/os/PowerManager.html#goToSleep%28long

В Манифест добавляем:

< uses-permission android:name="android.permission.WAKE_LOCK" /> 

Сам код:

  PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE); WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG"); wakeLock.acquire(); 

Немного про Admob:

forum.hellroom.ru/index.php?PHPSESSID=6ef77d2e403cac8c366ce8f5a9e3f9fa&topic=16515.0
habrahabr.ru/post/133858/
habrahabr.ru/post/203368/
Пример кода:
В Манифест добавляем:

     <uses-permission android:name="android.permission.INTERNET" />     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />      <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">         <meta-data             android:name="com.google.android.gms.version"             android:value="@integer/google_play_services_version" />         <activity             android:name="com.google.android.gms.ads.AdActivity"             android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" /> 

Прописываем в активити import com.google.android.gms.ads.*;
В onCreate:

 adView = new AdView(this);         adView.setAdUnitId("код баннера");         adView.setAdSize(AdSize.SMART_BANNER);          // Поиск разметки LinearLayout (предполагается, что ей был присвоен         // атрибут android:id="@+id/mainLayout").         RelativeLayout layout = (RelativeLayout)findViewById(R.id.RLMain);          // Добавление в разметку экземпляра adView.         layout.addView(adView);          // Инициирование общего запроса.         // AdRequest adRequest = new AdRequest.Builder().build();           AdRequest adRequest = new AdRequest.Builder().build(); //Для теста разкомментируем строчки и подставляем ID тестового девайса      /*   AdRequest adRequest = new AdRequest.Builder()                 .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)       // Эмулятор                 .addTestDevice("B6F0A0DED6232ADEA16984CB963C6552") // Тестовый телефон Galaxy Nexus                 .build();*/         // Загрузка adView с объявлением.         adView.loadAd(adRequest);  @Override     public void onPause() {         adView.pause();         super.onPause();     }      @Override     public void onResume() {         super.onResume();         adView.resume();     }      @Override     public void onDestroy() {         adView.destroy();         super.onDestroy();     } 

Как дать возможность оставить отзыв из программы:

stackoverflow.com/questions/2893350/how-to-launch-the-google-play-intent-in-give-feedback-mode-on-android
stackoverflow.com/questions/8031276/prompt-user-to-rate-an-android-app-inside-the-app

Пример кода:

 String appPackageName= getPackageName(); Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id="+appPackageName)); marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY|Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET|Intent.FLAG_ACTIVITY_MULTIPLE_TASK); startActivity(marketIntent);              

ссылка на оригинал статьи http://habrahabr.ru/post/232885/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *