Урок 100. Service. IntentService. Foreground. Автозагрузка сервиса

Обсуждение уроков
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Mikhail_dev » 18 апр 2013, 07:21

О каком процессе идёт речь? Там используется отдельный поток, а не процесс. А в андроиде эти понятия кардинально разные.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение neoksi » 18 апр 2013, 07:54

no-- писал(а):О каком процессе идёт речь? Там используется отдельный поток, а не процесс. А в андроиде эти понятия кардинально разные.
Я это прекрасно знаю.
У меня сервис запущен в отдельном процессе. Его могут множество раз вызвать, как системные процедуры приложения, так и пользователь. Каждый вызов должен породить отдельный поток, но мне нужно, чтоб эти потоки выполнялись не одновременно, а в порядке очереди. И тут IntentService для меня идеальное решение.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Mikhail_dev » 18 апр 2013, 07:57

А, вот оно что. Спасибо, буду знать. Мне даже это дело пригодится в скором времени.

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение brucemax » 24 апр 2013, 21:20

Накидал примерчик, в сервисе запускается TimerTask, который через каждые 10 сек проигрывает звуковой сигнал.. после того как телефон полежит некоторое время и экран погаснет интервалы проигрывания могут превосходить 10 сек.. даже в несколько раз.. foreground поможет? или есть другое решение???

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение damager82 » 29 апр 2013, 11:40

brucemax писал(а):Накидал примерчик, в сервисе запускается TimerTask, который через каждые 10 сек проигрывает звуковой сигнал.. после того как телефон полежит некоторое время и экран погаснет интервалы проигрывания могут превосходить 10 сек.. даже в несколько раз.. foreground поможет? или есть другое решение???
Блокировки в PowerManager вам нужны
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Danil
Сообщения: 4
Зарегистрирован: 01 авг 2013, 14:54

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Danil » 22 авг 2013, 18:41

damager82 писал(а): Вызываться должен в сервисе.
А вот насчет "как" - непонятно что вы имеете ввиду. Если речь о параметрах метода, то смотрите Урок 99 про уведомления.
Тема с startForeground, действительно, совсем не раскрыта. Даешь по ней отдельный урок!!! :P А в уроке с уведомлениями, складывается такое впечатление, что он действителен, только для устройств с Android меньше 3 версии.

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

NeoSvet
Сообщения: 11
Зарегистрирован: 19 авг 2013, 20:21

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение NeoSvet » 27 авг 2013, 08:58

Т.е. для запуска в Foreground надо обязательно создавать уведомление? А если оно не нужно?..
У меня сервис выступает в роли таймера-будильника. В onStartCommand создаю поток (Thread) и в нём использую TimeUnit.SECONDS.sleep - сойдет?) И только после слипа нужно уведомление, а до этого - не в тему!..

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение neoksi » 27 авг 2013, 10:40

NeoSvet,
для этого механизма обязательно. Но исходя из твоей задачи, ты задействуешь не те механизмы. Смотри в сторону AlarmManager.

NeoSvet
Сообщения: 11
Зарегистрирован: 19 авг 2013, 20:21

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение NeoSvet » 30 авг 2013, 17:02

Вообщем разобрался! :)

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

Код: Выделить всё

public int onStartCommand(Intent intent, int flags, int startId) {
		Notification main_notif=new Notification(0,"",0); //тут первый 0
		Intent main_intent=new Intent();
		PendingIntent main_pInt=PendingIntent.getActivity(MainService.this,0,main_intent,0);
		main_notif.setLatestEventInfo(MainService.this,"","",main_pInt);
		main_notif.flags|=Notification.FLAG_FOREGROUND_SERVICE;
		startForeground(333,main_notif);
		... 
}
2. Блокировка засыпания.

Добавляем в манифест права:

Код: Выделить всё

 <uses-permission android:name="android.permission.WAKE_LOCK"/> 
Код службы:

Код: Выделить всё

import android.os.PowerManager;

public class MainService extends Service {
	
	PowerManager.WakeLock wl;

	public void onCreate() {
		super.onCreate();
		PowerManager pm=(PowerManager)getSystemService(POWER_SERVICE);
		wl=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Label"); //в данном случае блокировка засыпания процессора
	  }	  
	 
	public int onStartCommand(Intent intent, int flags, int startId) {
		wl.acquire(); //активируем блокировку
		...
		wl.release(); //отключаем блокировку
	}

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

Манифест:

Код: Выделить всё

...
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>	
...
        <activity
            android:name="ru.neosvet.app.MainAct"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="ru.neosvet.app.MainService"
        		android:label="@string/main_srv">
			<intent-filter>
                <action android:name="ru.neosvet.app.MainService" />
				<category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>
		<receiver android:name=".AutoLoader" 
			android:enabled="true" android:exported="true" >
			<intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>	
		</receiver>
Настройки вынес в отдельный класс ещё до этого, чтобы иметь доступ к одним и тем же настройкам в разных активити, по этим же причинам тут и startMainSrv, который на деле не только запускает службу, но и передает ей новые значения настроек (если уже запущена)..
Вспомогательный класс:

Код: Выделить всё

public class Lib {
	public static SharedPreferences sPref;
	public static Editor ed;
	public final static String cParam1="Param1",cParam2="Param2",cParam3="Param3";

	 public static void startMainSrv(Activity act) {
	 	Intent intent=new Intent(act.getPackageName()+".MainService");
	 	intent.putExtra(cParam1,sPref.getString(cParam1,""));
	 	intent.putExtra(cParam2,sPref.getInt(cParam2,-1));
	 	intent.putExtra(cParam3,sPref.getBoolean(cParam3,false));
	 	act.startService(intent);
	 }
}
Я использую "закрыть активити", т.к. после сворачивания в Android 4-ой версии активити остается без заголовка...
Активити:

Код: Выделить всё

 public class MainAct extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		Lib.sPref=getPreferences(MODE_PRIVATE);
		Lib.ed=Lib.sPref.edit();
		Lib.startMainSrv(MainAct.this);
		if(getIntent().getBooleanExtra("l",false)) { //автозагрузчик сюда передаст true
			MainAct.this.finish(); // - закрыть активити
			//moveTaskToBack(true); - свернуть активити
		}
	}
}
Автозагрузчик:

Код: Выделить всё

 public class AutoLoader extends BroadcastReceiver {

	public void onReceive(Context context, Intent intent) {
		Intent i = new Intent();
		final String p="ru.neosvet.app";
        i.setClassName(p,p+".MainAct");
        i.putExtra("l",true); //сообщаем активити, что запускает её автозагрузчик
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
	}
}
Служба:

Код: Выделить всё

public class MainService extends Service {
	String param1; int param2; boolean param3;
	boolean boolNew=true; //переменная, отвечающая на вопрос "это новая служба, или только получение новых данных?"

	public int onStartCommand(Intent intent, int flags, int startId) {
	 	String mParam1; int mParam2; boolean mParam3;
	 	mParam1=intent.getStringExtra(Lib.cParam1);
	 	mParam2=intent.getIntExtra(Lib.cParam2,-1);
	 	mParam3=intent.getBooleanExtra(Lib.cParam3,false);
	 	if(boolNew) { 
	 	 	param1=mParam1;
	 	 	param2=mParam2;
	 	 	param3=mParam3;
 	 	 	// действия, если это новая служба
	 	 	boolNew=false;
		} else {
	 	 	// если это передача новых данных
 	 	 	// например, сравнивание mParam и param, и если они отличаются, то прежний процесс останавливается и запускается новый
	 	}
	}
Коль заговорил о процессах...
В упрощенном виде, процессы у меня выглядят так:

Код: Выделить всё

class ClassProcess {
	 boolean flag=false; // переменная обозначающая запущен ли процесс или нет
	 ClassProcess() {
	 	 flag=true;
	 	 new Work().start();
	 }
	public void Stop() {
		flag=false;
	}
    class Work extends Thread {
	 	 public void run() {
	 	 	 // тут задаются переменные
	 	 	 while(flag) {
	 	 	 	 // тело процесса
	 	 	 }
	 	 }
	 }
}
Использование такого процесса:

Код: Выделить всё

 ClassProcess pProcess; //задавать как глобальную переменную

pProcess =new ClassProcess(); //запуск процесса
pProcess.Stop(); //остановка процесса

Dronja
Сообщения: 12
Зарегистрирован: 05 сен 2013, 17:34

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Dronja » 05 сен 2013, 17:49

Подскажите, пожалуйста, как запустить сервис без создания activity (версии 4.0)?

Озорная Свинья
Сообщения: 59
Зарегистрирован: 02 фев 2013, 00:03

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Озорная Свинья » 05 сен 2013, 17:59

мож как-то так, хз

Код: Выделить всё

public class DemoApplication extends Application {
...
}

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение neoksi » 05 сен 2013, 22:33

Dronja писал(а):Подскажите, пожалуйста, как запустить сервис без создания activity (версии 4.0)?
Тут сразу возникает вопрос, когда этот сервис должен запускаться? При каких обстоятельствах.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Mikhail_dev » 06 сен 2013, 07:29

В автозагрузку добавляем запуск сервиса и в принципе всё.

Dronja
Сообщения: 12
Зарегистрирован: 05 сен 2013, 17:34

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Dronja » 06 сен 2013, 11:28

no-- писал(а):В автозагрузку добавляем запуск сервиса и в принципе всё.
для 2.3 работает отлично, но в 4.0 сервис после загрузки не стартует.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Mikhail_dev » 06 сен 2013, 12:50

Да, там есть проблема, что на четверке не срабатывает. На сколько помню, там в манифесте надо поиграться с permission, с вроде как BOOT_COMPLETED. Либо её надо вывести на уровень Application, либо наоборот в сам сервис. В общем что-то из этого. Попробуйте это, либо бросьте сюда свой манифест.

Dronja
Сообщения: 12
Зарегистрирован: 05 сен 2013, 17:34

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Dronja » 06 сен 2013, 13:04

Код: Выделить всё

    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="16" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <application android:allowBackup="true"
        android:label="@string/app_name"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme">
        <service android:name=".MyService" android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </service>
        <receiver android:name=".MyBroadReceiv"
            android:enabled="true"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
            <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                    <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

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

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение klblk » 06 сен 2013, 13:29

у меня работает так:
манифест:
[syntax=xml]<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
....
<receiver android:name=".BootCompleteReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>[/syntax]

ресивер:
[syntax=java]public class BootCompleteReceiver extends BroadcastReceiver
{

@Override
public void onReceive(Context context, Intent arg1)// autorun
{

Intent service = new Intent(context, MyService.class);
context.startService(service);

}

}[/syntax]

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

Dronja
Сообщения: 12
Зарегистрирован: 05 сен 2013, 17:34

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Dronja » 06 сен 2013, 14:11

klblk писал(а):вроде ничего не упускаю.
на какой версии android работает?

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение klblk » 08 сен 2013, 14:57

Dronja писал(а):
klblk писал(а):вроде ничего не упускаю.
на какой версии android работает?
2.3 + , в том числе и на 4

Dronja
Сообщения: 12
Зарегистрирован: 05 сен 2013, 17:34

Re: Урок 100. Service. IntentService. Foreground. Автозагруз

Сообщение Dronja » 09 сен 2013, 10:49

klblk писал(а):2.3 + , в том числе и на 4
скиньте, пожалуйста, манифест

Ответить