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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,275
#1

BroadcastReceiver - Программирование Android

13.05.2016, 14:12. Просмотров 496. Ответов 11
Метки нет (Все метки)

У меня такой вопрос если я создал ресивер и прописал его в манифесте. Мой ресивер прослушивает определенные интенты. И у меня такой вопрос если я в методе ресивера onReceive() стартану сервис, то после того как метод onReceive() закончится приемник перейдет в неактивное состояние и система сможет его удалить когда потребуется память так? И соответственно мой сервис будет удален да? А если я в методе onReceive запущу Thread() то этот поток может быть удален системой вместе с ресивером?

Добавлено через 8 минут
И еще если я создал ресивер программно внутри активити в методе onCreate(), то этот ресивер будет существовать пока существует активити или только пока выполняется метод onCreate()? Если активити будет уничтожено, то ресивер тоже будет уничтожен? А если он в манифесте прописан то можно его как то снять с прослушивания при помоши unregisterReciever там?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2016, 14:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос BroadcastReceiver (Программирование Android):

Уведомления в BroadcastReceiver - Программирование Android
Привет, уважаемые! Прикрутил BroadcastReceiver, мониторю входящие смс, пытаюсь отключить звук входящего смс если оно удовлетворяет моим...

BroadcastReceiver и startActivity - Программирование Android
У меня есть служба и BroadcastReceiver. Когда приходит событие, то я вызываю startService. Если служба не запущена, то она запускается и...

BroadcastReceiver + static переменная - Программирование Android
Работая с бродкаст ресивером задался вопросом, как же он всё-таки работает?) Есть следующий код, который фиксирует состояние телефонного...

Виджеты, BroadcastReceiver и Строки - Программирование Android
Здравствуйте. Занимаюсь созданием виджета. Делаю что то наподобие нажатия на кнопку. Использую Broadcast. Предполагается ,что после нажатия...

Чтение preferences в BroadcastReceiver - Программирование Android
Доброго времени суток. Сам смысл того что я делаю: есть активити, которая отображает состояние батареи, есть активити настроек и есть...

Servise, BroadcastReceiver, Activity - Программирование Android
Здравствуйте, есть сервис и активити, сервис возвращает данные активити через BroadcastReceiver... все работает отлично, но когда виходиш...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Pablito
2494 / 1939 / 605
Регистрация: 12.05.2014
Сообщений: 6,798
Завершенные тесты: 1
13.05.2016, 15:01 #2
почему бы тебе не проверить самому?
0
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,275
13.05.2016, 19:25  [ТС] #3
А как я проверю уничтожается ли ресивер системой или нет? В AS есть для этого средства?Просто как понять что ресивер был уничтожен?
0
powowstal
28 / 28 / 5
Регистрация: 21.03.2013
Сообщений: 346
14.05.2016, 00:25 #4
yura91, я немного прочитал документацию по ресиверу и там сказано типа ресивер "будет жить" пока не отработает задачу до конца и может умереть (естественно без отработки метода онДестрой, как все процессы которые тихо рубятся не удостаиваясь честь вызвать свой онДестрой, вообще его походу для стеба придумали) когда закончится вся память (у меня на тесте закрывались другие работающие приложения но не ресивер).
Цитата Сообщение от yura91 Посмотреть сообщение
система сможет его удалить когда потребуется память так?
- угусь, он ведь отработал свое
Цитата Сообщение от yura91 Посмотреть сообщение
мой сервис будет удален
-
Цитата Сообщение от yura91 Посмотреть сообщение
да
Цитата Сообщение от yura91 Посмотреть сообщение
может быть удален системой вместе с ресивером
опять же ресивер выполнил задачу - "Добби теперь свободный". А потоку безразлично откуда ты его запускаешь. Он как кот: есть корм (память) он есть, нет корма "адиас амигос" - он уже в Мексике(система его убет за незаконное пересичение границы)
0
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,275
14.05.2016, 01:10  [ТС] #5
А как то можно гарантировать что ресивер не упадет? Просто у меня есть AlarmManager, который в определенное время посылает ресиверу интенты, тот срабатывает и запускает сервис, который выполняет свои задачи. Приложение должно работать очень долго(несколько месяцев даже) и компоненты ресивер Alarm, сервисы, потоки не должны упасть(не быть уничтожены системой и другие причины падения). Как это грамотно обеспечить? Есть варианты?

Добавлено через 3 минуты
А потоку безразлично откуда ты его запускаешь. Он как кот: есть корм (память) он есть, нет корма "адиас амигос" - он уже в Мексике(система его убет за незаконное пересичение границы)
Получается не важно откуда я запускаю поток(из неубиваемого сервиса или еще от куда), он может быть уничтожен системой как только у нее будет нехватка памяти так?
0
powowstal
28 / 28 / 5
Регистрация: 21.03.2013
Сообщений: 346
14.05.2016, 02:11 #6
yura91,
Цитата Сообщение от yura91 Посмотреть сообщение
Получается не важно откуда я запускаю поток(из неубиваемого сервиса или еще от куда), он может быть уничтожен системой как только у нее будет нехватка памяти так?
да.
Цитата Сообщение от yura91 Посмотреть сообщение
А как то можно гарантировать что ресивер не упадет?
короче на это гугл говорит есть же
Java
1
START_STICKY
для сервиса, но на моему kikkat плевать что есть такое свойство (пишут что только на киткате такая проблема).
частично поможет http://development-for-android.blogs...post_3068.html
При таком розкладе только пользователь в настройках сможет остановить сервис, но есть вариант с нехваткой памяти но у меня не закрывался когда память заканчивалась.
Но почему же тогда "частично" - просто любая программа типа клинера остановит ваш сервис с воли пользователя конечно же
0
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,275
14.05.2016, 12:11  [ТС] #7
Я хочу чтобы AlarmManager выполнил задачу через ресивер в определенную дату и время. Я протестировал следующим образом. Создал активити в ней определил AlarmManager и PendingIntent. Создал ресивер(в котором в методе onReceive() идет создание txt файла) и прописал его в манифесте. Дату запуска Alarmа задал через Calendar, но это почему то не работает. Вот код

MainActivity
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
import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
 
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Calendar;
 
public class MainActivity extends AppCompatActivity {
 
Context context;
    final String LOG_TAG = "myLogs";
 
    NotificationManager nm;
    AlarmManager am;
    Intent intent1;
    Intent intent2;
    PendingIntent pIntent1;
    PendingIntent pIntent2;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        context = MainActivity.this;
        //nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        //am = (AlarmManager) getSystemService(ALARM_SERVICE);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        context = MainActivity.this;
        Calendar myAlarmDate = Calendar.getInstance();
        myAlarmDate.setTimeInMillis(System.currentTimeMillis());
        myAlarmDate.set(2016, 5, 14, 8, 00, 0);
 
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent _myIntent = new Intent(context, Receiver.class);
        _myIntent.putExtra("MyMessage","HERE I AM PASSING THEPERTICULAR MESSAGE WHICH SHOULD BE SHOW ON RECEIVER OF ALARM");
        PendingIntent _myPendingIntent = PendingIntent.getBroadcast(context, 123, _myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
 
        alarmManager.set(AlarmManager.RTC_WAKEUP, myAlarmDate.getTimeInMillis(),_myPendingIntent);
 
    }
}
ресивер

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
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Environment;
import android.util.Log;
 
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
public class Receiver extends BroadcastReceiver {
 
    final String LOG_TAG = "myLogs";
    NotificationManager nm;
    @Override
    public void onReceive(Context ctx, Intent intent) {
       // Log.d("Func", "onReceive");
        //Log.d("Func", "action = " + intent.getAction());
        //Log.d("func", "extra = " + intent.getStringExtra("extra"));
        BufferedWriter out;
        try {
 
            FileWriter fileWriter= new FileWriter(Environment.getExternalStorageDirectory().getPath()+"/tsxt.txt");
 
            out = new BufferedWriter(fileWriter);
 
            out.write("Your text to write");
 
            out.close();
 
        }catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Манифест

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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.alarm.user.alarmmanager">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 
        <receiver
            android:name=".Receiver"
            android:enabled="true"
            android:exported="true" >
        </receiver>
 
    </application>
 
</manifest>
Не подскажете что я не так делаю? В чем моя ошибка? Как исправить чтобы через Alarm и ресивер в определенное время и дату создавался файл??

Добавлено через 2 минуты
Может активити с Alarmом просто система уничтожает(не дожидаясь определенной даты и времени). Поэтому он не сработал?
0
powowstal
28 / 28 / 5
Регистрация: 21.03.2013
Сообщений: 346
14.05.2016, 17:26 #8
Цитата Сообщение от yura91 Посмотреть сообщение
PendingIntent _myPendingIntent = PendingIntent.getBroadcast(context, 123, _myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
эта строка точно запускает рессивер?
0
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,275
14.05.2016, 19:21  [ТС] #9
да запускает я попробовал
Java
1
2
3
 PendingIntent _myPendingIntent = PendingIntent.getBroadcast(context, 123, _myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
 
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 4000,_myPendingIntent);
Так сработало
а так
Java
1
alarmManager.set(AlarmManager.RTC_WAKEUP, myAlarmDate.getTimeInMillis(),_myPendingIntent);
нет в чем причина ?

Добавлено через 58 минут
Может это нужно делать из неубиваемого сервиса а не активити?
0
powowstal
28 / 28 / 5
Регистрация: 21.03.2013
Сообщений: 346
14.05.2016, 20:58 #10
yura91,
Цитата Сообщение от yura91 Посмотреть сообщение
alarmManager.set(AlarmManager.RTC_WAKEUP, myAlarmDate.getTimeInMillis(),_myPendingIntent);
тут нет ваших 4х секунд
Цитата Сообщение от yura91 Посмотреть сообщение
+ 4000
получается что вы пытаетесь запустить ваш alarmManager когда время уже прошло
0
yura91
30 / 28 / 2
Регистрация: 23.10.2013
Сообщений: 2,275
14.05.2016, 21:16  [ТС] #11
Ну да тут есть вопрос с переводом времени? Нужно Calendar на московское время настроить верно и передать в Alarm?
0
powowstal
28 / 28 / 5
Регистрация: 21.03.2013
Сообщений: 346
14.05.2016, 23:46 #12
yura91, посмотри что вернет
Java
1
buf_date=System.currentTimeMillis(); Log.i(Msg, "date : " + new SimpleDateFormat("dd/MM/yyyy HH:mm").format(buf_date*1000));
1000 -возможно лишний
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2016, 23:46
Привет! Вот еще темы с ответами:

BroadcastReceiver, куда добавить код? - Программирование Android
помогите понять часть статьи https://habrahabr.ru/post/234425/. добрался до Для работы BroadcastReceiver'а надо добавить немного кода в...

BroadcastReceiver, считывание состояние телефона - Программирование Android
Добрый день! Создал вот такой класс, для считывания состояния телефона во время звонка. public class CallReceiver extends...

Запуск BroadcastReceiver без активити - Программирование Android
Имеется приложение, включающее в себя единственный класс: public class MyReceiver extends BroadcastReceiver{ @Override ...

Как заставить работать BroadcastReceiver? - Программирование Android
Добрый день! Собственно идея: есть стандартный плеер телефона(HTC One m7 Android 4.4.3) и проводная гарнитура с одной кнопкой. Но по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.05.2016, 23:46
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru