Google Android - это несложно • Просмотр темы - Урок 100. Service. IntentService. Foreground. Автозагрузка сервиса

Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 16 авг 2018, 18:34

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 88 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
СообщениеДобавлено: 18 апр 2013, 07:21 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 14:45
Сообщений: 2386
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 321 раз.
О каком процессе идёт речь? Там используется отдельный поток, а не процесс. А в андроиде эти понятия кардинально разные.

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 апр 2013, 07:54 
Аватар пользователя

Зарегистрирован: 26 июл 2012, 10:42
Сообщений: 712
Благодарил (а): 6 раз.
Поблагодарили: 18 раз.
no-- писал(а):
О каком процессе идёт речь? Там используется отдельный поток, а не процесс. А в андроиде эти понятия кардинально разные.

Я это прекрасно знаю.
У меня сервис запущен в отдельном процессе. Его могут множество раз вызвать, как системные процедуры приложения, так и пользователь. Каждый вызов должен породить отдельный поток, но мне нужно, чтоб эти потоки выполнялись не одновременно, а в порядке очереди. И тут IntentService для меня идеальное решение.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 апр 2013, 07:57 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 14:45
Сообщений: 2386
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 321 раз.
А, вот оно что. Спасибо, буду знать. Мне даже это дело пригодится в скором времени.

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 24 апр 2013, 21:20 
Аватар пользователя

Зарегистрирован: 01 апр 2012, 16:09
Сообщений: 117
Откуда: Минск
Благодарил (а): 11 раз.
Поблагодарили: 5 раз.
Накидал примерчик, в сервисе запускается TimerTask, который через каждые 10 сек проигрывает звуковой сигнал.. после того как телефон полежит некоторое время и экран погаснет интервалы проигрывания могут превосходить 10 сек.. даже в несколько раз.. foreground поможет? или есть другое решение???


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 апр 2013, 11:40 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
brucemax писал(а):
Накидал примерчик, в сервисе запускается TimerTask, который через каждые 10 сек проигрывает звуковой сигнал.. после того как телефон полежит некоторое время и экран погаснет интервалы проигрывания могут превосходить 10 сек.. даже в несколько раз.. foreground поможет? или есть другое решение???

Блокировки в PowerManager вам нужны

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 авг 2013, 18:41 
Аватар пользователя

Зарегистрирован: 01 авг 2013, 14:54
Сообщений: 4
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
damager82 писал(а):
Вызываться должен в сервисе.
А вот насчет "как" - непонятно что вы имеете ввиду. Если речь о параметрах метода, то смотрите Урок 99 про уведомления.


Тема с startForeground, действительно, совсем не раскрыта. Даешь по ней отдельный урок!!! :P А в уроке с уведомлениями, складывается такое впечатление, что он действителен, только для устройств с Android меньше 3 версии.

Ваши уроки просто бомба! Спасибо Вам за них :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 27 авг 2013, 08:58 

Зарегистрирован: 19 авг 2013, 20:21
Сообщений: 11
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Т.е. для запуска в Foreground надо обязательно создавать уведомление? А если оно не нужно?..
У меня сервис выступает в роли таймера-будильника. В onStartCommand создаю поток (Thread) и в нём использую TimeUnit.SECONDS.sleep - сойдет?) И только после слипа нужно уведомление, а до этого - не в тему!..


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 27 авг 2013, 10:40 
Аватар пользователя

Зарегистрирован: 26 июл 2012, 10:42
Сообщений: 712
Благодарил (а): 6 раз.
Поблагодарили: 18 раз.
NeoSvet,
для этого механизма обязательно. Но исходя из твоей задачи, ты задействуешь не те механизмы. Смотри в сторону AlarmManager.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 авг 2013, 17:02 

Зарегистрирован: 19 авг 2013, 20:21
Сообщений: 11
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Вообщем разобрался! :)

1. Foreground без сообщения в уведомлениях.
Ставим 0 на месте id иконки.

Код: [ Загрузить ] [ Скрыть ]
  1. public int onStartCommand(Intent intent, int flags, int startId) { 
  2.         Notification main_notif=new Notification(0,"",0); //тут первый 0 
  3.         Intent main_intent=new Intent(); 
  4.         PendingIntent main_pInt=PendingIntent.getActivity(MainService.this,0,main_intent,0); 
  5.         main_notif.setLatestEventInfo(MainService.this,"","",main_pInt); 
  6.         main_notif.flags|=Notification.FLAG_FOREGROUND_SERVICE; 
  7.         startForeground(333,main_notif); 
  8.         ...  


2. Блокировка засыпания.

Добавляем в манифест права:
Код: [ Загрузить ] [ Скрыть ]
  1. <uses-permission android:name="android.permission.WAKE_LOCK"/>  


Код службы:
Код: [ Загрузить ] [ Скрыть ]
  1. import android.os.PowerManager; 
  2.  
  3. public class MainService extends Service { 
  4.      
  5.     PowerManager.WakeLock wl; 
  6.  
  7.     public void onCreate() { 
  8.         super.onCreate(); 
  9.         PowerManager pm=(PowerManager)getSystemService(POWER_SERVICE); 
  10.         wl=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Label"); //в данном случае блокировка засыпания процессора 
  11.       }       
  12.       
  13.     public int onStartCommand(Intent intent, int flags, int startId) { 
  14.         wl.acquire(); //активируем блокировку 
  15.         ... 
  16.         wl.release(); //отключаем блокировку 
  17.     } 
  18.  


3. Автозапуск.
Сделал автозапуск через активити чтобы иметь доступ к её настройкам.

Манифест:
Код: [ Загрузить ] [ Скрыть ]
  1. ... 
  2. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>     
  3. ... 
  4.         <activity 
  5.             android:name="ru.neosvet.app.MainAct" 
  6.             android:label="@string/app_name" > 
  7.             <intent-filter> 
  8.                 <action android:name="android.intent.action.MAIN" /> 
  9.                 <category android:name="android.intent.category.LAUNCHER" /> 
  10.             </intent-filter> 
  11.         </activity> 
  12.         <service android:name="ru.neosvet.app.MainService" 
  13.                 android:label="@string/main_srv"> 
  14.             <intent-filter> 
  15.                 <action android:name="ru.neosvet.app.MainService" /> 
  16.                 <category android:name="android.intent.category.DEFAULT" /> 
  17.             </intent-filter> 
  18.         </service> 
  19.         <receiver android:name=".AutoLoader"  
  20.             android:enabled="true" android:exported="true" > 
  21.             <intent-filter> 
  22.                 <action android:name="android.intent.action.BOOT_COMPLETED" /> 
  23.             </intent-filter>     
  24.         </receiver> 


Настройки вынес в отдельный класс ещё до этого, чтобы иметь доступ к одним и тем же настройкам в разных активити, по этим же причинам тут и startMainSrv, который на деле не только запускает службу, но и передает ей новые значения настроек (если уже запущена)..
Вспомогательный класс:
Код: [ Загрузить ] [ Скрыть ]
  1. public class Lib { 
  2.     public static SharedPreferences sPref; 
  3.     public static Editor ed; 
  4.     public final static String cParam1="Param1",cParam2="Param2",cParam3="Param3"; 
  5.  
  6.      public static void startMainSrv(Activity act) { 
  7.          Intent intent=new Intent(act.getPackageName()+".MainService"); 
  8.          intent.putExtra(cParam1,sPref.getString(cParam1,"")); 
  9.          intent.putExtra(cParam2,sPref.getInt(cParam2,-1)); 
  10.          intent.putExtra(cParam3,sPref.getBoolean(cParam3,false)); 
  11.          act.startService(intent); 
  12.      } 


Я использую "закрыть активити", т.к. после сворачивания в Android 4-ой версии активити остается без заголовка...
Активити:
Код: [ Загрузить ] [ Скрыть ]
  1. public class MainAct extends Activity { 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.main); 
  7.          
  8.         Lib.sPref=getPreferences(MODE_PRIVATE); 
  9.         Lib.ed=Lib.sPref.edit(); 
  10.         Lib.startMainSrv(MainAct.this); 
  11.         if(getIntent().getBooleanExtra("l",false)) { //автозагрузчик сюда передаст true 
  12.             MainAct.this.finish(); // - закрыть активити 
  13.             //moveTaskToBack(true); - свернуть активити 
  14.         } 
  15.     } 


Автозагрузчик:
Код: [ Загрузить ] [ Скрыть ]
  1. public class AutoLoader extends BroadcastReceiver { 
  2.  
  3.     public void onReceive(Context context, Intent intent) { 
  4.         Intent i = new Intent(); 
  5.         final String p="ru.neosvet.app"; 
  6.         i.setClassName(p,p+".MainAct"); 
  7.         i.putExtra("l",true); //сообщаем активити, что запускает её автозагрузчик 
  8.         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
  9.         context.startActivity(i); 
  10.     } 


Служба:
Код: [ Загрузить ] [ Скрыть ]
  1. public class MainService extends Service { 
  2.     String param1; int param2; boolean param3; 
  3.     boolean boolNew=true; //переменная, отвечающая на вопрос "это новая служба, или только получение новых данных?" 
  4.  
  5.     public int onStartCommand(Intent intent, int flags, int startId) { 
  6.          String mParam1; int mParam2; boolean mParam3; 
  7.          mParam1=intent.getStringExtra(Lib.cParam1); 
  8.          mParam2=intent.getIntExtra(Lib.cParam2,-1); 
  9.          mParam3=intent.getBooleanExtra(Lib.cParam3,false); 
  10.          if(boolNew) {  
  11.               param1=mParam1; 
  12.               param2=mParam2; 
  13.               param3=mParam3; 
  14.               // действия, если это новая служба 
  15.               boolNew=false; 
  16.         } else { 
  17.               // если это передача новых данных 
  18.               // например, сравнивание mParam и param, и если они отличаются, то прежний процесс останавливается и запускается новый 
  19.          } 
  20.     } 


Коль заговорил о процессах...
В упрощенном виде, процессы у меня выглядят так:
Код: [ Загрузить ] [ Скрыть ]
  1. class ClassProcess { 
  2.      boolean flag=false; // переменная обозначающая запущен ли процесс или нет 
  3.      ClassProcess() { 
  4.           flag=true; 
  5.           new Work().start(); 
  6.      } 
  7.     public void Stop() { 
  8.         flag=false; 
  9.     } 
  10.     class Work extends Thread { 
  11.           public void run() { 
  12.                // тут задаются переменные 
  13.                while(flag) { 
  14.                     // тело процесса 
  15.                } 
  16.           } 
  17.      } 


Использование такого процесса:
Код: [ Загрузить ] [ Скрыть ]
  1. ClassProcess pProcess; //задавать как глобальную переменную 
  2.  
  3. pProcess =new ClassProcess(); //запуск процесса 
  4. pProcess.Stop(); //остановка процесса 


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 05 сен 2013, 17:49 

Зарегистрирован: 05 сен 2013, 17:34
Сообщений: 12
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Подскажите, пожалуйста, как запустить сервис без создания activity (версии 4.0)?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 05 сен 2013, 17:59 

Зарегистрирован: 02 фев 2013, 00:03
Сообщений: 59
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
мож как-то так, хз
Код: [ Загрузить ] [ Скрыть ]
  1. public class DemoApplication extends Application { 
  2. ... 


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 05 сен 2013, 22:33 
Аватар пользователя

Зарегистрирован: 26 июл 2012, 10:42
Сообщений: 712
Благодарил (а): 6 раз.
Поблагодарили: 18 раз.
Dronja писал(а):
Подскажите, пожалуйста, как запустить сервис без создания activity (версии 4.0)?

Тут сразу возникает вопрос, когда этот сервис должен запускаться? При каких обстоятельствах.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 сен 2013, 07:29 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 14:45
Сообщений: 2386
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 321 раз.
В автозагрузку добавляем запуск сервиса и в принципе всё.

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 сен 2013, 11:28 

Зарегистрирован: 05 сен 2013, 17:34
Сообщений: 12
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
no-- писал(а):
В автозагрузку добавляем запуск сервиса и в принципе всё.

для 2.3 работает отлично, но в 4.0 сервис после загрузки не стартует.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 сен 2013, 12:50 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 14:45
Сообщений: 2386
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 321 раз.
Да, там есть проблема, что на четверке не срабатывает. На сколько помню, там в манифесте надо поиграться с permission, с вроде как BOOT_COMPLETED. Либо её надо вывести на уровень Application, либо наоборот в сам сервис. В общем что-то из этого. Попробуйте это, либо бросьте сюда свой манифест.

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 сен 2013, 13:04 

Зарегистрирован: 05 сен 2013, 17:34
Сообщений: 12
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Код: [ Загрузить ] [ Скрыть ]
  1.     <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="16" /> 
  2.     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
  3.  
  4.     <application android:allowBackup="true" 
  5.         android:label="@string/app_name" 
  6.         android:icon="@drawable/ic_launcher" 
  7.         android:theme="@style/AppTheme"> 
  8.         <service android:name=".MyService" android:enabled="true"> 
  9.             <intent-filter> 
  10.                 <action android:name="android.intent.action.BOOT_COMPLETED"/> 
  11.             </intent-filter> 
  12.         </service> 
  13.         <receiver android:name=".MyBroadReceiv" 
  14.             android:enabled="true" 
  15.             android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > 
  16.             <intent-filter> 
  17.                     <action android:name="android.intent.action.BOOT_COMPLETED"/> 
  18.                     <category android:name="android.intent.category.DEFAULT" /> 
  19.             </intent-filter> 
  20.         </receiver> 
  21.  
  22.     </application> 

разрешение BOOT_COMPLETED уже прописывал везде, итог тот же


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 сен 2013, 13:29 
Аватар пользователя

Зарегистрирован: 18 окт 2012, 11:17
Сообщений: 1098
Откуда: г. Красноярск
Благодарил (а): 26 раз.
Поблагодарили: 279 раз.
у меня работает так:
манифест:
Код: [ Загрузить ] [ Скрыть ]
Using XML Syntax Highlighting
  1. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  2. ....
  3. <receiver android:name=".BootCompleteReceiver" >
  4.             <intent-filter>
  5.                 <action android:name="android.intent.action.BOOT_COMPLETED" />
  6.             </intent-filter>
  7.         </receiver>


ресивер:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public class BootCompleteReceiver extends BroadcastReceiver
  2. {
  3.  
  4.         @Override
  5.         public void onReceive(Context context, Intent arg1)// autorun
  6.         {
  7.  
  8.                         Intent service = new Intent(context, MyService.class);
  9.                         context.startService(service);
  10.  
  11.         }
  12.  
  13. }


вроде ничего не упускаю.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 сен 2013, 14:11 

Зарегистрирован: 05 сен 2013, 17:34
Сообщений: 12
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
klblk писал(а):
вроде ничего не упускаю.

на какой версии android работает?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 08 сен 2013, 14:57 
Аватар пользователя

Зарегистрирован: 18 окт 2012, 11:17
Сообщений: 1098
Откуда: г. Красноярск
Благодарил (а): 26 раз.
Поблагодарили: 279 раз.
Dronja писал(а):
klblk писал(а):
вроде ничего не упускаю.

на какой версии android работает?


2.3 + , в том числе и на 4


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 сен 2013, 10:49 

Зарегистрирован: 05 сен 2013, 17:34
Сообщений: 12
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
klblk писал(а):
2.3 + , в том числе и на 4

скиньте, пожалуйста, манифест


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 88 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB