2

У меня имеется готовое приложение состоящее из ресивера и 3 сервисов, основная работа выполняется в фоне. Activity в манифесте прописан. Вот код Activity:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

Т.е. есть ярлык во вкладке приложения, его можно там запсутить, и при запуске появляется окно Activity. В нём ничего нет, но на мой взгляд оно лишнее. Так вот вопрос: возможен ли запуск BroadcastReceiver'а, и его корректная работа без класса MainActivity, который наследуется от Activity (чтобы не было этого окна)? И как это сделать? Уже задавал этот вопрос, но в комментариях - сказали оформить в виде отдельного вопроса.

Manifest.xml:

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <receiver
        android:name="com.example.smsreciv.SMSReceiver"
        class="com.example.smsreciv.SMSReceiver" android:exported="true" android:enabled="true">
        <intent-filter android:priority="100" >
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
    <service android:name="MyService"></service>
    <service android:name="SmsService"></service>
    <service android:name="MtsSmsService"></service>
    <service android:name="MTSEXTService"></service>
    <service android:name="TranzService"></service>
    <activity android:name="MainActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>


</application>

2
  • смотря что делает ресивер. Если ни чего связанного с активити, то можно удалить как сам класс MainActvity, так и его тег в манифесте. 2 июл 2014 в 11:16
  • 1
    Да, я ведь в начале так и сделал, просто убрал его из манифеста, но в процессе тестирования приложения, оно иногда не выполняло своих функций, когда возвращал обратно все начинало работать, а дальше я решил не экспериментировать и спросить на форуме.
    – FFFNikolay
    2 июл 2014 в 23:45

1 ответ 1

3

Да, можно. Достаточно декларировать ресивер в манифесте с атрибутами exported=true и enabled=true, а запуск сервиса реализовать в onReceive() ресивера.

Второй хак способ: объявить атрибуты активити прозрачными Theme.Translucent.NoTitleBar - тогда он будет невидимым и никому не помешает.

Если же требуется, чтобы сервис стартовал и без ресивера, то надо будет ловить бродкаст android.intent.action.BOOT_COMPLETED и сажать на него запуск сервиса.

Update

Упс, это работает только в версии Android'а до 3.1. В новых версиях требуется, чтобы была запущена Activity. Так что остается вариант с прозрачным активити.

5
  • 1
    Да все правильно, Активити ничего не выполняет в приложении, и не запускает, вызов сервисов происходит в onReceive() ресивера. Так мне можно после проставленных атрибутов exported=true и enabled=true ресиверу, убрать из манифеста Активити и все будет нормально? Про прозрачность я и раньше думал, но если возможно его убрать это не к чему. Спасибо.
    – FFFNikolay
    2 июл 2014 в 23:43
  • 1
    Убираю активити из манифеста, устанавливаю приложение, а ресивер не запущен, спит подлец.
    – FFFNikolay
    3 июл 2014 в 2:13
  • Манифест добавил в вопрос, как убрать активити, чтоб запускался ресивер без него?
    – FFFNikolay
    3 июл 2014 в 3:05
  • 2
    @FFFNikolay см. апдейт
    – Barmaley
    3 июл 2014 в 3:15
  • 1
    Понял. Значит едем как ехали с прозрачным окном. Спасибо. Кстати похоже, что именно из-за этого мой первый ресивер и не работал на версии 4.3, но работал на 2.3.3
    – FFFNikolay
    3 июл 2014 в 4:10

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.