Форум программистов, компьютерный форум CyberForum.ru

Таймер, AlarmManager и Service на Android - Программирование Android

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Http POST запрос, как правильно написать http://www.cyberforum.ru/android-dev/thread1793079.html
Добрый день, мне нужно отправить данные на сервер, посредством http post запросом, нужно добавить автомобиль, сам пост запрос выглядит вот так: http://namesyte.ru/api/v2/vehicles?token=67d41878f5222b64162e99ab11d6d045&mark=nameMarka&mode=nameModel но при написании в андроиде возникает ошибка: URL url = new URL("http://namesyte.ru/api/v2/vehicles?token=67d41878f5222b64162e99ab11d6d045");...
Программирование Android Ошибка при использовании action bar sherlock Всем привет, недавно достался проект с action bar sherlock, нужно добавить поддержку твиттера, я использовал Fabric plagin для этого, добавил нужные зависимости. Но в проекте используется com.android.support:support-v4:19.0.0. и соответственно buildToolsVersion '19.0.1'. а твиттер требует 21+. Когда я в проекте меняю версию сборки или либы, то получаю ошибку. Гуглил, вариантов не так много, но... http://www.cyberforum.ru/android-dev/thread1793066.html
Программирование Android Получить данных о пользователе по gmail (пол, возраст)
Добрый день, уважаемые. Я умею считывать адреса почтовых ящиков с телефона. Определяю основной у пользователя по gmail. - и если обрезать название почты можно кое-как вытянуть имя..или ник. Но пришла мысль, что, может можно как-то вытягивать из телефона или из почты или еще как, такие данные как: возраст, пол, и прочее? За ранее спасибо!
Вылет приложения с MediaPlayer Программирование Android
Использую один MediaPlayer. Даю ему разный звук при нажатии на каждую из 5 кнопок вот так: @Override public void onClick(View v) { switch(v.getId()) { case R.id.flats_btn1: flats = MediaPlayer.create(getActivity(), R.raw.carrier); flats.start(); break; Но хочу, чтобы при нажатии при...
Программирование Android NavRing http://www.cyberforum.ru/android-dev/thread1792969.html
Ребята. Нужно подсказки как правильно сделать. В MM убрали Navigation Ring. Кто не знает что это - посмотрите в гугл картинки. В приложении в imageView я с помощью canvas примерно нарисовал. 1. Мне нужно понять, что нужно использовать, чтобы этот NavRing был анимирован. Ну, чтобы элементы его меняли свои свойства, когда например наводишь на ярлыки. 2. Потом нужно отображение поверх всех окон....
Программирование Android HttpURLConnection cookie аутентификация Здравствуйте, такой вопрос есть url1 = http://site.com/accounts/login/?next=/ где post запросом передается user,pass если все правильно то перенаправляет на url2 = http://site.com/ вопрос как правильно залогинится?? делал так String url_site = "https://site.com/accounts/login/?next=/"; String cookies = CookieManager.getInstance().getCookie(url_site); URL... подробнее

Показать сообщение отдельно
msgusa
6 / 6 / 3
Регистрация: 29.06.2011
Сообщений: 156

Таймер, AlarmManager и Service на Android - Программирование Android

12.08.2016, 17:51. Просмотров 368. Ответов 6
Метки (Все метки)

Добрый вечер.
Я уже создавал тем(ы) про таймер. И мне очень здорово помогли разобраться с Андроидом, особенно OlegJV, powowstal. Собственно, нижеприведенный код отчасти будет состоять из их примеров. Так как с Андроидом познакомился относительно недавно (чуть больше недели), мне сложно довести самому дело до конца.

Я хочу сделать свой первый таймер, который бы отсчитывал время в обратную сторону. В коде, который приведу, это CountDownTimer с AlarmManager. Почему с AlarmManager? Благодаря OlegJV, я выяснил, что таймер довольно потребная вещь, а мне бы желательно, чтобы он, мой таймер, работал на длительные промежутки и при отключении экрана (выхода из приложения), таймер (а вернее AlarmManager) продолжал бы свою работу, но сам CountDownTimer останавливался бы, чтобы не расходовать мне мою батарею. Узнал, что для такой задачи существуют сервисы, отчаянно пытался вкурить как они работают, но не смог. Слишком много всего и даже не знаю за что и как ухватиться. И тем более как реализовать.

Также, есть проблема с кнопками "+" и "-" - они отвечают за добавление и вычитание времени к основному таймеру. Есть одна особенность кнопки, отвечающей за добавление. При нажатии должен включиться новый таймер (неосновной), тикающий в прямом порядке, должно добавляться значение из TextView к значению CountDownTimer-а, и новом нажатии "+" добавление по прежнему должно быть, а неосновной таймер бы обнулялся.
При нажатии "-" должно происходить только вычитание.

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

activity_main.xml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?xml version="1.0" encoding="utf-8"?>
<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.gmail.test.myapplication.MainActivity"
    android:transitionGroup="false">
    <!--  -->
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="START"
        android:id="@+id/startBtn"
        android:layout_centerInParent="true"
        android:nestedScrollingEnabled="true"
        android:visibility="visible" />
 
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/timeView"
        android:gravity="center"
        android:textSize="60sp"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="55dp"
        android:typeface="monospace" />
 
    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="+"
        android:id="@+id/addTimeBtn"
        android:layout_above="@+id/startBtn"
        android:layout_toLeftOf="@+id/startBtn"
        android:layout_toStartOf="@+id/startBtn"
        android:visibility="invisible"
        android:textAlignment="center" />
 
    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="-"
        android:id="@+id/subtractTimeBtn"
        android:layout_above="@+id/startBtn"
        android:layout_toRightOf="@+id/startBtn"
        android:layout_toEndOf="@+id/startBtn"
        android:visibility="invisible"
        android:textAlignment="center" />
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/timeUpView"
        android:layout_alignTop="@+id/subtractTimeBtn"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="13dp"
        android:width="60dp" />
 
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:ems="10"
        android:id="@+id/addTimeEdit"
        android:layout_alignBottom="@+id/addTimeBtn"
        android:layout_toLeftOf="@+id/addTimeBtn"
        android:layout_toStartOf="@+id/addTimeBtn"
        android:visibility="invisible"
        android:textAlignment="center" />
 
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:ems="10"
        android:id="@+id/subtractTimeEdit"
        android:layout_above="@+id/startBtn"
        android:layout_toRightOf="@+id/subtractTimeBtn"
        android:layout_toEndOf="@+id/subtractTimeBtn"
        android:visibility="invisible"
        android:textAlignment="center" />
 
</RelativeLayout>
Main Activity
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
package com.noob.wissen.timerapp;
 
import android.annotation.TargetApi;
import android.app.AlarmManager;
import android.content.Context;
import android.content.pm.ActivityInfo;
import java.util.Calendar;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 
 
import java.util.Timer;
import java.util.TimerTask;
 
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 
    private Button startBtn;
    private Button addTimeBtn;
    private Button subtractTimeBtn;
    //
    private TextView timeView;
    private TextView timeUpView;
    //
    private EditText addTimeEdit;
    private EditText subtractTimeEdit;
 
    //private Timer timer;
    private Timer timerUp;
 
    private int countdown = 1200;
    private boolean timerIsStarted;
    private int countup = 0;
    AlarmManager manager;
    Long preTime;
    Long postTime;
    Long delay;
    CountDownTimer timer;
    Calendar calendar;
 
 
    @TargetApi(Build.VERSION_CODES.N)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Находим элементы на разметке
        startBtn = (Button) findViewById(R.id.startBtn);
        addTimeBtn = (Button) findViewById(R.id.addTimeBtn);
        subtractTimeBtn = (Button) findViewById(R.id.subtractTimeBtn);
        //
        timeView = (TextView) findViewById(R.id.timeView);
        timeUpView = (TextView) findViewById(R.id.timeUpView);
        //
        addTimeEdit = (EditText) findViewById(R.id.addTimeEdit);
        subtractTimeEdit = (EditText) findViewById(R.id.subtractTimeEdit);
        // Назначаем слушатель для кнопок
        startBtn.setOnClickListener(this);
        addTimeBtn.setOnClickListener(this);
        subtractTimeBtn.setOnClickListener(this);
        //
        addTimeEdit.setText("0");
        subtractTimeEdit.setText("0");
        //
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
 
        calendar = Calendar.getInstance();
        preTime = calendar.getTimeInMillis();
        calendar.add(Calendar.MINUTE, 5);
        postTime = calendar.getTimeInMillis();
        delay = postTime - preTime;
        manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        manager.set(AlarmManager.RTC_WAKEUP, postTime, null);
 
 
    }
 
    @Override
    public void onClick(View view) {
        if (view == startBtn) {
            timerIsStarted = !timerIsStarted;
            startTimer(timerIsStarted);
            startBtn.setVisibility(View.VISIBLE);
            addTimeBtn.setVisibility(View.VISIBLE);
            subtractTimeBtn.setVisibility(View.VISIBLE);
            addTimeEdit.setVisibility(View.VISIBLE);
            subtractTimeEdit.setVisibility(View.VISIBLE);
        }
        else if (view == addTimeBtn) {
            timerIsStarted = !timerIsStarted;
            addTime(timerIsStarted);
        }
        else if (view == subtractTimeBtn) {
            timerIsStarted = !timerIsStarted;
            subtractTime(timerIsStarted);
        }
    }
 
    @TargetApi(Build.VERSION_CODES.N)
    private void startTimer(boolean started) {
        if (started) {
            CountDownTimer timer = new CountDownTimer(delay, 1) {
                @Override
                public void onTick(long millisUntilFinished) {
                    final int seconds = (int)(millisUntilFinished / 1000) % 60;
                    final int minutes = (int)(millisUntilFinished / (1000 * 60)) % 60;
                    final int hours = (int)(millisUntilFinished / (1000 * 3600)) % 60;
 
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            timeView.setText(String.format("%02d:%02d:%02d", hours,
                                    minutes, seconds));
                        }
                    });
                }
 
                @Override
                public void onFinish() {
 
                }
            };
            timer.start();
        }
        //timer = new Timer();
        //timer.schedule(new TimerTask() {
        // @Override
        //public void run() {
        //h.sendEmptyMessage(1);
        // нюанс: таймер запускается в отдельном потоке
        // из него нет доступа к элементам интерфейса, в т.ч. к TextView
        // поэтому используем класс Handler, посылая в него сообщение, в данном случае "1",
        // цифра с потолка, можно любую
        // }
        //}, 0, 1000);
 
        else {
            if (timer != null) {
                try {
                    timer.cancel();
                }
                catch (Exception e) {
                }
            }
        }
    }
 
    private void addTime (boolean started) {
        if (started) {
            timerUp = new Timer();
            timerUp.schedule(new TimerTask() {
                @Override
                public void run() {
                    h.sendEmptyMessage(2);
                }
            }, 0, 1000);
        }
        else {
            if (timer != null) {
                try {
                    timer.cancel();
                }
                catch (Exception e) {
                }
            }//end if
        }
    }//end addTime()
 
    private void subtractTime (boolean started) {
        if (started) {
 
            h.sendEmptyMessage(3);
 
        }
        else {
            if (timer != null) {
                try {
                    timer.cancel();
                }
                catch (Exception e) {
                }
            }
        }
    }
    //Полагаю, что здесь реализовано неверно. При нажатии кнопки "+" или "-"
    //возникает откровенная дичь. Все не то, что не работает, но и ломает основный таймер в timeView.
    //В java-коде там, где был swing.timer, находился обработчик события TimerTick, куда можно было занести
    //countdown--. А арифметические операции были вынесены в отдельный обработчик соответствующих кнопок.
    Handler h = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
                //case 1: // если получили сообщение с нашей цифрой (сообщения могут быть из разных источников)
                    //countdown--;
                    //timeView.setText(String.format("%02d:%02d:%02d", countdown/3600,
                            //countdown/60%60, countdown%60)); // из Handler есть доступ к TextView
                    //break;
                case 2:
                    countup++;
                    timeUpView.setText(String.format("%02d:%02d:%02d", countup/3600,
                            countup/60%60, countup%60));
                    int addcountdown = Integer.parseInt(addTimeEdit.getText().toString());
                    delay += 60 * addcountdown;
                    //countup = 0;
                case 3:
                    int subtractcountdown = Integer.parseInt(subtractTimeEdit.getText().toString());
                    countdown -= 60 * subtractcountdown;
 
            }
        };
    };
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru