Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,326
#1

BroadcastReceiver

13.05.2016, 14:12. Просмотров 652. Ответов 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
Привет, уважаемые! Прикрутил BroadcastReceiver, мониторю входящие смс, пытаюсь...

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

BroadcastReceiver + static переменная
Работая с бродкаст ресивером задался вопросом, как же он всё-таки работает?)...

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

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

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

Добавлено через 3 минуты
А потоку безразлично откуда ты его запускаешь. Он как кот: есть корм (память) он есть, нет корма "адиас амигос" - он уже в Мексике(система его убет за незаконное пересичение границы)
Получается не важно откуда я запускаю поток(из неубиваемого сервиса или еще от куда), он может быть уничтожен системой как только у нее будет нехватка памяти так?
0
powowstal
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 369
14.05.2016, 02:11 #6
yura91,
Цитата Сообщение от yura91 Посмотреть сообщение
Получается не важно откуда я запускаю поток(из неубиваемого сервиса или еще от куда), он может быть уничтожен системой как только у нее будет нехватка памяти так?
да.
Цитата Сообщение от yura91 Посмотреть сообщение
А как то можно гарантировать что ресивер не упадет?
короче на это гугл говорит есть же
Java
1
START_STICKY
для сервиса, но на моему kikkat плевать что есть такое свойство (пишут что только на киткате такая проблема).
частично поможет http://development-for-android.blogs...post_3068.html
При таком розкладе только пользователь в настройках сможет остановить сервис, но есть вариант с нехваткой памяти но у меня не закрывался когда память заканчивалась.
Но почему же тогда "частично" - просто любая программа типа клинера остановит ваш сервис с воли пользователя конечно же
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,326
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
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 369
14.05.2016, 17:26 #8
Цитата Сообщение от yura91 Посмотреть сообщение
PendingIntent _myPendingIntent = PendingIntent.getBroadcast(context, 123, _myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
эта строка точно запускает рессивер?
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,326
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
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 369
14.05.2016, 20:58 #10
yura91,
Цитата Сообщение от yura91 Посмотреть сообщение
alarmManager.set(AlarmManager.RTC_WAKEUP, myAlarmDate.getTimeInMillis(),_myPendingIntent);
тут нет ваших 4х секунд
Цитата Сообщение от yura91 Посмотреть сообщение
+ 4000
получается что вы пытаетесь запустить ваш alarmManager когда время уже прошло
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,326
14.05.2016, 21:16  [ТС] #11
Ну да тут есть вопрос с переводом времени? Нужно Calendar на московское время настроить верно и передать в Alarm?
0
powowstal
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 369
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
14.05.2016, 23:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2016, 23:46

Servise, BroadcastReceiver, Activity
Здравствуйте, есть сервис и активити, сервис возвращает данные активити через...

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

BroadcastReceiver, считывание состояние телефона
Добрый день! Создал вот такой класс, для считывания состояния телефона во...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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