Нужен пример кода о том, как вечно запускать службу Android в фоновом режиме, даже когда устройство спит, например, Whatsapp?

ForeignKey представлен django.forms.ModelChoiceField, который является ChoiceField, выбор которого является модель QuerySet. См. Ссылку для ModelChoiceField .

Итак, укажите QuerySet для атрибута поля queryset. Зависит от того, как ваша форма построена. Если вы создадите явную форму, у вас будут поля с именами напрямую.

form.rate.queryset = Rate.objects.filter(company_id=the_company.id)

Если вы берете объект ModelForm по умолчанию, form.fields["rate"].queryset = ...

Это делается явно в представлении. Нет взлома.

24
задан zeeshan 19 March 2015 в 17:28
поделиться

5 ответов

С тех пор, как я опубликовал этот вопрос, я реализовал два разных подхода к этому решению в нескольких приложениях.


APPROACH 1

Этот фрагмент взят из приложения, в котором я использую push-уведомления, которые требуют мгновенных вызовов для активации устройства. Вот что я делаю:

  1. использую разрешение WAKE_LOCK и
  2. используем абстрактный класс Wakelocker
  3. , используем его в Activity по мере необходимости:

Манифест:

<uses-permission android:name="android.permission.WAKE_LOCK" />

Класс WakeLocker:

public abstract class WakeLocker {
private static PowerManager.WakeLock wakeLock;

public static void acquire(Context context) {
    if (wakeLock != null) wakeLock.release();

    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
            PowerManager.ACQUIRE_CAUSES_WAKEUP |
            PowerManager.ON_AFTER_RELEASE, "WakeLock");
    wakeLock.acquire();
}

public static void release() {
    if (wakeLock != null) wakeLock.release(); wakeLock = null;
}
}

Пример класса активности:

private final BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Waking up mobile if it is sleeping
        WakeLocker.acquire(getApplicationContext());
        // do something
        WakeLocker.release();
}

APPROACH 2

Лучше всего, если вы хотите, чтобы Android контролировал пробуждение, и можете жить с периодическим пробуждением вашего кода , Просто используйте AlarmManager для регулярного вызова класса Service. Вот некоторый код из моего приложения LifeLog24:

MainActivity

Intent ll24 = new Intent(context, AlarmReceiverLifeLog.class);
    PendingIntent recurringLl24 = PendingIntent.getBroadcast(context, 0, ll24, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarms.setRepeating(AlarmManager.RTC_WAKEUP, first_log.getTime(), AlarmManager.INTERVAL_HOUR, recurringLl24); // Log repetition

Класс тревоги

public class AlarmReceiverLifeLog extends BroadcastReceiver {

    private static final String TAG = "LL24";
    static Context context;

    @Override
    public void onReceive(Context context, Intent intent) {

        Log.v(TAG, "Alarm for LifeLog...");

        Intent ll24Service = new Intent(context, LifeLogService.class);
        context.startService(ll24Service);
    }
    }

и LifeLogService .класс, где я делаю свои вещи. В этом случае будильник срабатывает каждый час и запускает BroadcastReceiver, который в свою очередь запускает службу. Это еще не все, чтобы убедиться, что служба не запускается дважды и так далее, но вы понимаете, как это делается. А на самом деле AlarmManager - лучший способ сделать это, так как вы не беспокоитесь об использовании батареи и т. Д., А Android заботится о регулярном пробуждении вашей Службы.

24
ответ дан Siddharth 19 March 2015 в 17:28
поделиться

Это очень просто.
шаги:
1.создать класс обслуживания.
2.создать класс BroadcastReceiver
3.озвонить BroadReceiver в метод обслуживания onDestroy
4.В onReceive метод класса BroadReceiver запустить сервис один раз снова.

Вот код

Файл манифеста: `

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity android:name=".LauncherActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service
        android:name=".utilities.NotificationService"
        android:enabled="true">

    </service>

    <receiver
        android:name=".utilities.RestartService"
        android:enabled="true"
        android:exported="true"
        android:label="RestartServiceWhenStopped"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
        <intent-filter>
            <action android:name="RestartService" />
        </intent-filter>
    </receiver>
</application>

`

Класс обслуживания

public class NotificationService extends Service {
    public NotificationService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
       super.onStartCommand(intent, flags, startId);
       return START_STICKY;
   }

   @Override
   public void onDestroy() {
       super.onDestroy();
       Intent restartService = new Intent("RestartService");
       sendBroadcast(restartService);
  }
}

Класс BroadcastReceiver

public class RestartService extends BroadcastReceiver {

     @Override
     public void onReceive(Context context, Intent intent) {

         context.startService(new Intent(context,NotificationService.class));
     }
 }
8
ответ дан Shakti Phartiyal 19 March 2015 в 17:28
поделиться

Следуйте этим простым шагам, чтобы сохранить работоспособность навсегда в устройстве Android. 1. Позвоните в службу с помощью диспетчера тревог. 2. вернуть START_STICKY в методе onStart. 3. При уничтожении вызовите диспетчер аварийных сигналов и перезапустите службу, используя метод startService. 4. (Необязательно) Повторите пункт 3 в методе onTaskRemoved.

1
ответ дан Syed Danish Haider 19 March 2015 в 17:28
поделиться

Вы можете использовать функцию startForeground (int, Notification) , см. Здесь и здесь

. Запущенная служба может использовать startForeground (int, Notification ) API для перевода службы в состояние переднего плана, где система считает, что это то, о чем пользователь активно осведомлен, и, следовательно, не является кандидатом на убийство при нехватке памяти. (По-прежнему теоретически возможно уничтожение службы под сильным давлением памяти со стороны текущего приложения переднего плана, но на практике это не должно вызывать беспокойства.)

-2
ответ дан Ricardo Pessoa 19 March 2015 в 17:28
поделиться

Запрос частичного WakeLock.

<uses-permission android:name="android.permission.WAKE_LOCK" />

 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");
mWakeLock.acquire();

onStartCommand retrun START_STICKY:

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId); 
        return START_STICKY;
    }
0
ответ дан Basbous 19 March 2015 в 17:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: