Android: выполнить вход в приложение в фоновом режиме при загрузке

У меня есть приложение VOIP, мне нужно войти в приложение в фоновом режиме при загрузке устройства.

В настоящее время инициализация моего приложения выполняется на UI Active(onCreate()).

У меня есть следующие вещи в моем уме, может ли кто-нибудь помочь и развеять мои сомнения.

  1. Сервисный дизайн необходим для достижения этой задачи??
  2. Какая Service Remote(AIDL) или местная служба и почему?
  3. Как происходит взаимодействие UI и Service?
  4. После того, как UI активен, кто получает ответные вызовы? UI или Service?
  5. Должен ли я сделать Service в качестве моего Controller, т.е. Service в UI данные проходят наоборот?

Пример приложения: Skype.


person NitZRobotKoder    schedule 26.04.2012    source источник


Ответы (5)


Таким образом, есть много способов добиться того, чего вы хотите, вопрос в том, что лучше соответствует вашему стилю и дизайну. Надеюсь, вы найдете эту информацию полезной.

  1. Существует несколько вариантов входа приложения в фоновом режиме при запуске. Первое, что вам понадобится, это BroadcastReceiver, который определен как получатель в манифесте. Попросите BroadcastReceiver перехватить намерение ACTION_BOOT_COMPLETED. Отсюда вы можете запустить свой сервис. Это приводит к № 2.

  2. Если все, что вы делаете, это вызовы RESTful, то действительно IntentService был бы идеальным. Разница между IntentService и Service прост: IntentService запускается из основного потока, выполняет свой "код" и умирает. Однако служба работает в основном потоке (это важный факт) и работает долго, поэтому о ней нужно сообщить stopSelf(). Кроме того, служба также с меньшей вероятностью будет уничтожена по сравнению с действием (компоненты приложения уничтожаются, чтобы освободить место в памяти для вновь запущенных приложений), т.е. он имеет более высокий приоритет. Службу также можно объявить служба переднего плана, которая требует уведомления, но имеет еще более высокий приоритет. Я думаю, что в вашем случае Сервис был бы идеальным.

  3. После того, как ваш пользовательский интерфейс (Действие) открыт, лучшим способом подключения к Сервису будет Binder. Это позволит использовать несколько интерфейсов для службы из разных приложений/компонентов, если это необходимо. AIDL — довольно крутая вещь, но, по моему опыту, гораздо сложнее управлять, поскольку все параметры должны быть примитивными или Parcables. AIDL также медленнее и менее эффективен, потому что это действительно форма IPC. Когда служба запускается с намерением, вызывается метод onStartCommand(). Если служба запускается приложением, пытающимся выполнить привязку к ней, вызывается метод onBind(). Но вы можете запустить службу с намерением и затем привязаться к ней. Если вы предпочитаете подход RESTful, когда у вас есть только быстрые вызовы данных, вы можете использовать IntentService с ResultReceiver. Это отличная статья, написанная о примерах ввода-вывода Google и в целом хорошо реализованная, если вы заинтересованы в IntentService и ResultReceiver.

  4. Это зависит от вас. Используя Binder или AIDL, ваша активность может вызывать методы службы точно так же, как метод объекта, где «обратный вызов» будет просто возвратом метода. Если вы используете ResultReceiver, действие, взаимодействующее с приемником, будет обратным вызовом. Вы также можете просто передавать намерения туда и обратно, но это может привести к беспорядку. Опять же, для вашего случая подход Binder будет хорошим, а также Receiver.

  5. Думайте о службе как о модели в системе MVVM — используйте ее как помощника для получения данных, а не как нечто, управляющее логикой приложения.

Извините, если это кажется грязным, существует так много способов добиться того, что вы ищете. Это просто вопрос того, что лучше всего подходит для вашей ситуации, что вы «чувствуете» лучше. Не говоря уже о том, что Android SDK довольно большой. Я постарался затронуть все темы, которые могли бы вам помочь. Удачи!

person jjNford    schedule 07.05.2012
comment
Ответ относится к моему вопросу, поэтому помечаю его как ответ .. Спасибо, jjNford - person NitZRobotKoder; 08.05.2012
comment
@NitZRobotKoder нет проблем, все сервисы и то, как они используются, могут быть сложными. это помогает знать, куда смотреть вперед. удачи! - person jjNford; 08.05.2012

Попробуйте сервис с загрузочным приемником. Вот пример, который я нашел после быстрого поиска в Google. Затем обязательно сохраните где-нибудь информацию для входа, когда приложение запустится. Не уверен, какие у вас могут быть обратные вызовы, поэтому очень сложно ответить на эту часть. Я бы сказал, что если обратные вызовы должны влиять на пользовательский интерфейс, тогда пусть активность возьмет их на себя при запуске. Если вам нужен пользовательский интерфейс, когда работает только служба, вероятно, лучше всего выдать уведомление и вызвать соответствующую активность с данными обратного вызова.

person MikeIsrael    schedule 30.04.2012
comment
@Mikelsrael Спасибо за ваш вклад. Обратные вызовы будут касаться успешного входа/ошибки или сетевого включения/отключения и т. д. Но я не понял этого контекста вашего комментария.. Т.е. Если вам нужен пользовательский интерфейс, когда работает только служба, возможно лучше всего выдать уведомление и вызвать соответствующее действие с данными обратного вызова. - person NitZRobotKoder; 02.05.2012
comment
@NitZRobotKoder Я говорил, что хороший способ уведомления пользователя — через панель уведомлений. Так что просто создайте службу, которая пытается войти в систему и регистрируется как широковещательный приемник для сетевых изменений. Затем, когда служба приходит к событию, о котором она должна уведомить пользователя, появляется всплывающее уведомление на панели уведомлений. Подробнее об уведомлениях см. по этой ссылке: developer.android.com/guide/topics /ui/уведомления/ - person MikeIsrael; 02.05.2012
comment
@NitZRobotKoder Я не знаю, что это значит. Кто будет отвечать за открытие уведомления и выполнение коммуникации? Сервис. - person MikeIsrael; 02.05.2012
comment
@Mikelsrael, я имел в виду, поскольку его приложение VOIP получает данные с сервера, кто получает его SERVICE/Active UI??? - person NitZRobotKoder; 02.05.2012
comment
@NitZRobotKoder Вам нужно будет разобраться с этим самостоятельно. Разработка voip-приложения — это серьезный проект, и вы не найдете здесь кого-то, кто просто сделает это за вас. - person MikeIsrael; 02.05.2012
comment
давайте продолжим обсуждение в чате - person NitZRobotKoder; 02.05.2012

вы можете аутентифицировать вход пользователя с помощью пакета фоновых служб com.javaorigin.android.sample.service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class MyService extends Service {

   String tag="TestService";
   @Override
   public void onCreate() {
       super.onCreate();
       Toast.makeText(this, "Service created...", Toast.LENGTH_LONG).show();      
       Log.i(tag, "Service created...");
   }

   @Override
   public void onStart(Intent intent, int startId) {      
       super.onStart(intent, startId);  
       Log.i(tag, "Service started...");
   }
   @Override
   public void onDestroy() {
       super.onDestroy();
       Toast.makeText(this, "Service destroyed...", Toast.LENGTH_LONG).show();
   }

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


public class SampleAction extends Activity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {      
       super.onCreate(savedInstanceState);
       TextView view = new TextView(this);      
       view.setText("Service Test");
       Intent i = new Intent();
       i.setClassName( "com.javaorigin.android.sample.service",
        "com.javaorigin.android.sample.service.MyService" );
       bindService( i, null, Context.BIND_AUTO_CREATE);
       this.startService(i);      
       setContentView(view);
   }
}
person coading fever    schedule 26.04.2012
comment
Deepak, u r Запуск активности, затем запуск службы. Мое приложение должно войти в систему без пользовательского интерфейса. - person NitZRobotKoder; 26.04.2012
comment
Представьте себе случай, когда пользователь уже установил его, а настройки типа не спрашивать каждый раз. - person NitZRobotKoder; 26.04.2012
comment
теперь, когда запускается ваша основная активность, вы можете вызвать фоновую службу, просто startService(new Intent(KhoobsurtiActivity.this,FetchPostService.class)); какую обработку вы хотите выполнить на этой странице, вы можете очень легко аутентифицировать - person coading fever; 26.04.2012
comment
Я хочу тихо войти в систему в фоновом режиме, в это время моя основная деятельность не будет активной. Когда пользователь нажимает значок приложения, я должен видеть домашнюю страницу, а не процесс входа в систему. - person NitZRobotKoder; 26.04.2012

Если вход в систему занимает так много времени, используйте [AccountManager][1] и делайте это только один раз. Идея AccountManager токена или любых других учетных данных, которые вам нужно использовать в вашем Service.

В вашем конкретном случае я думаю, что лучший способ общения вашего Activity с Service - это привязка к нему.

person Macarse    schedule 03.05.2012

Лучший источник информации об основах использования ServiceSDK. Короче говоря, AIDL используется для связи IPC, и пока вы запускаете службу в том же процессе, она вам не нужна. Я полагаю, у вас есть два варианта:

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

    @Override
    public void onCreate() {
        Data data = performLogin();
        Intent i = new Intent(ACTION_VOIP_LOGIN);
        i.putExtra(EXTRA_LOGIN_DATA, data);
        mContext.sendStickyBroadcast(i);
    }
    
    ...
    
    private final class LoginReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // You may use a Bundle instead
            Data data = intent.getParcelableExtra();
            processLoginData(data)
        }
    }
    
    protected void onCreate(Bundle savedInstanceState) {
         ...
         IntentFilter filter = new IntentFilter(ACTION_VOIP_LOGIN);
         mContext.registerReceiver(new LoginReceiver(), filter);
    }
    
  2. Во втором случае вы можете захотеть переместить всю свою логику в сервис. Здесь вы расширите класс Binder. Подробнее см. в этой статье о SDK.

person Andrey Ermakov    schedule 05.05.2012