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);
            



Поделиться публикацией

Похожие публикации

Комментарии 23

    +4
    Хорошая подборка для новичков. Правда, по звуку — приведенный способ не подходит для быстрой смены коротких звуков (звуки в игре, допустим). Тогда лучше использовать SoundPool:
    mSoundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
    moveId = mSoundPool.load(this, R.raw.button_move, 1);
    mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
        @Override
        public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
            Log.d("SoundPool_15", "onLoadComplete, sampleId = " + sampleId + ", status = " + status);
        }
    });
    
      0
      Спасибо, сохранил.
      +3
      А объясните, пожалуйста, вот этот момент:

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

      Каким образом создание intent, который нигде далее не используется, повысит вероятность выхода из activity?
        0
        Опирался на:
        stackoverflow.com/questions/3473168/clear-the-entire-history-stack-and-start-a-new-activity-on-android
        stackoverflow.com/questions/4190429/how-to-clear-the-android-stack-of-activities
        Очищается стэк поэтому finish(); закрывает приложение, а не перебрасывает на предыдущую активность.
          +2
          Вы неверно истолковали ответ на stackoverflow.
          В вашем коде объект intent никуда не передаётся, нигде не используется и собирается garbage collector. То есть по фунциональности ваш пример ничем не отличается от простого вызова метода finish().

          Но если вызывать метод startActivity и передать туда созданный intent с установленными флагами — откроется новая activity, при этом очистив весь activity stack, это правда. Однако, у вас об этом нигде не сказано.

          По поводу атрибута android:noHistory=«true» тоже есть вопрос. Чтобы по нажатии кнопки back закрылось именно приложение, а не одна activity — этот атрибут нужно прописать для каждой аctivity в приложении, что является весьма и весьма странным решением.

          С таким наполнением статья будет нести новичкам больше вреда, чем пользы, имхо.
            0
            Но если вызывать метод startActivity и передать туда созданный intent с установленными флагами — откроется новая activity, при этом очистив весь activity stack, это правда. Однако, у вас об этом нигде не сказано.

            Опять же, это правда только для API>=11. Да, можно в принципе уже потихоньку на это глаза закрыть, но вот буквально недавно, пытаясь понять, как очистить стек на устройствах с API<11, я не смог найти ответ. Есть вроде как бекпорт (IntentCompat.FLAG_ACTIVITY_CLEAR_TASK), но и он с API 11 o_O
              0
              Я думаю, что подразумевалась следующая конструкция:
              Intent intent = new Intent(ActivityCurrent.this, ActivityNext.class); intent.startActivity(intent); finish();
              То есть, создав новую активити, она самостоятельно завершается, таким образом, истории не будет.
              0
              Стек же очищается при использовании Intent, а у вас он просто создан и наполнен необходимыми данными. Это намерение, а намерение должно быть кем-нибудь выполнено.

              (edit) опередили меня с ответом.
            +3
            Как явно программно закрыть приложение при нажатии по кнопке:

            finish() не закрывает приложение, данный метод закрывает Activity.
            Обработка нажатия кнопки назад (Back Pressed):

            И часто Вы вызываете новую Activity при нажатии назад?

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

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

            Мне кажется это почти одно и тоже.

            Вы написали как о Java, так и о Android, всё вперемешку. Нужно понимать, что нельзя указать все базовые вещи для новичков, что Вы постарались сделать. В итоге, тут и десятой части нет того, что по Android надо для новичков, и сотой, того, что Java.
            Некоторые вещи (такие как Task в Android) лучше писать более конкретизировано, либо лучше не писать. Да в принципе относится ко многому.

            ИМХО, в такой статье нет необходимости. Лучше написать статью — сборник ссылок по полезным Android вещам на хабре. Раньше такая была (сейчас нет под рукой), но она уже не особо актуальна.
              +1
              Полностью согласен. ИМХО в таком формате статья не нужна, так как тут по большой части или ссылки на stackoverflow или куцые вырезанные ответы с того же сайта. В продолжение Toast.makeText(this,...). Toast может быть вызван из другого класса, и что такое this в этом случае для новичка — становится непонятно. А кнопка назад может быть обработана не через onBackPressed, а при помощи
              @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { // do something on back. return true; } return super.onKeyDown(keyCode, event); }
              Что может быть более полезно и удобно во многих случаях, а также избавит от некоторых ошибок в работе программы, а также даёт более удобную дополнительную обработку.
              Прыгать по EditText лучше программно, так как сталкивался с той проблемой, что не все устройства одинаково поддерживают подобные прыжки, и иногда даже падают.
              ИМХО, в этой статье просто подняты некоторые вопросы (далеко не самые важные для новичков), а ответов нет. Слабая статья. Для новичков советую На startandroid уроки для начала посмотреть. Там все подобные неточности достаточно объёмно объяснены.
              +2
              Много спорных момент с учётом того, что это для новичков статья.

              Например:
              Обращение к ресурсам: getResources().getColor(R.color.errorColor)

              Новичок сразу закричит: «Что за getResources()? У меня нет такого метода». Ибо нужен контекст. В Activity отработает, во фрагменте доступ через getActivity() и т.п.

              За статью спасибо, но, всё же, подобные вопросы гуглятся обычно по необходимости и находятся ответы довольно быстро, посему не вижу целесообразности в подобной статье =/
                0
                Спасибо за конструктив. Да, нагуглить можно, но я поделился способами, которые использовал сам, отбирая ссылки, которые пригодились.
                +5
                Ребят, это бесполезно пытаться что-то выучить по таким FAQам, у вас наверняка этот список вопросов возник в ходе чего-то. Лучший способ — придумать идею для приложения, пусть несложного, и реализовать. И возникнувшие вопросы из серии «жизненного цикла» или «как заставить вибрировать», которые появятся, решать.
                  0
                  Есть такой сайт — startandroid.ru. В нём сейчас множество уроков, которые будут полезны для новичков. Год назад появился видеоканал — Start Android, который возглавил другой человек, с разрешения админа сайта. В данный момент, я с создателем видеоканала, продумываем разработку мобильного приложения для данного сайта и видеоканала. В планах сделать:
                  — просмотр уроков
                  — просмотр видеоуроков, как и их скачивание
                  — тесты уроков
                  — навигация по наиболее частым вопросам
                  Если у кого есть вопросы и предложения — пишите либо мне, либо автору видео уроков (Виталий Непочатов).
                    0
                    image
                      +1
                      Eclipse мастдай. Сейчас либо AS, либо IDEA 13 (платная, либо бесплатная). Хотя eclipse немного жалко…
                        0
                        Eclipse всё ещё нужен, например для создания плагинов для unity3d.
                          0
                          Тут речь о том, что авторы видео-уроков не заморачиваются с объяснением как настроить другую IDE для учебы по их урокам. А для таких опытных людей я думаю это не слишком трудно.

                          Начал с уроков по Java на hexlet.org, поставил и настроил IDEA.
                          Потом начал смотреть там же, уроки по программированию для андройд, уже настраивают Eclipse.
                          startandroid.ru вроде то же на Eclipse начинают уроки а заканчивают уже на AS.
                          И я как средний пользователь этих уроков вынужден ставить по очереди то одно, то другое, то третье, так как боюсь что из-за разницы в IDE и подключенных «модулей» у меня будут проблемы с воспроизведением материала.
                            0
                            А почему
                            Eclipse мастдай. Сейчас либо AS, либо IDEA 13
                            ?
                            А то я больше по .NET-у загоняюсь и может что-то упустил.
                              +1
                              Довольно много багов, связанных с Eclipse. Особенно дело касается случая, когда приходится обновить Android Development Tools. Это похоже на танцы с бубном, когда что-то кого-то не находит и ты идешь гуглить. AS тут выглядит лучше, при этом она еще в beta версии.
                              Неявный плюс, но всё же — рендеринг в Eclipse хуже, чем той же AS.
                              Опять же, это моё сугубое ИМХО, но все разработчики, которых я знаю, ушли с Eclipse либо в AS, либо в IDEA, что в принципе одно и тоже.
                      +2
                      Способ вызова диалога устаревший и, если не ошибаюсь, deprecated. Нужно использовать DialogFragment.
                        –3
                        Подборка хорошая для новичка. Руки давно не доходили с работой, но сейчас опять заинтриговало.
                          0
                          Некоторые вопросы вызывают недоумение. «Конвертация string to float» правда что ли? Это то, что действительно нужно знать новичку? Новичку стоит просто зайти на developer.android.com/ и читать с самого начала. Конечно же после изучения java.

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое