Как реализовать один BroadcasReceiver и другой activity как действие запуска

#android #android-activity #android-manifest

#Android #android-активность #android-манифест

Вопрос:

У меня есть два действия запуска,
1. Действие приемника, которое является широковещательным приемником.
2. Действие, которое должно быть основным действием запуска.

При поступлении SMS действие получателя запускает .MainActivity (BroadcastReceiver) и далее запускает одну службу. (Без графического интерфейса пользователя) и без открывающей Settings активности.
Другое действие .Settings является основным действием запуска.

Цель, которую я хочу достичь:
Когда пришло sms, receiver действие работает как есть. Но когда я хочу изменить настройки Setting , начинается действие.

Manifest.xml

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.aa"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />

<uses-permission android:name="android.permission.RECEIVE_SMS" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <activity
        android:name="com.example.aa.FindLocation"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="com.example.aa.MAIN" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.example.aa.Settings"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="com.example.aa.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver android:name=".MainActivity"
        android:enabled="false" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </receiver>

    <service android:name=".Servc" >
        <intent-filter>
            <action android:name="com.example.Servc" />
        </intent-filter>
    </service>
</application>

</manifest>
  

Проблема
1.
[2014-07-06 02:55:14 — Aa] Загрузка Aa.apk на устройство ‘S5830f4524b76’
[2014-07-06 02:55:14 — Aa] Установка Aa.apk…
[2014-07-06 02:55:18 — Aa] Успех!
[2014-07-06 02:55:18 — Aa] Запуск действия com.example.aa.Settings на устройстве S5830f4524b76
[2014-07-06 02:55:19 — Aa] ActivityManager: Запуск: намерение { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.aa/.Settings }
2.
Какие изменения следует внести в манифест, чтобы он заработал?

Комментарии:

1. Что вы имеете в виду «Когда приходит SMS, действие получателя запускает. MainActivity «. Я не вижу никакой «активности получателя» в вашем манифесте. Я думаю, вы имеете в виду «.MainActivity запускается при получении sms».

Ответ №1:

Не определяйте свой sms-приемник в манифесте. Удалите его.

Создайте широковещательный приемник, который запускается при загрузке, определив приведенный ниже элемент в вашем манифесте :

 <receiver android:name=".BootUpReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>
  

Вам нужно будет добавить это разрешение в свой манифест :

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

Затем зарегистрируйте там свой BroadcastReceiver для приема sms :

 public class BootUpReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        SmsReceiver smsreceiver = new SmsReceiver();        
        IntentFilter fltr_smsreceived = new IntentFilter(
                    "android.provider.Telephony.SMS_RECEIVED");
            registerReceiver(smsreceiver, fltr_smsreceived);
        }
    }
  

SmsReceiver это ваш широковещательный приемник. Например :

 public class SmsReceiver extends BroadcastReceiver {

    void setActivityHandler(){
        //instantiate member variables if required
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle pdusBundle = intent.getExtras();
        Object[] pdus=(Object[])pdusBundle.get("pdus");
        SmsMessage messages=SmsMessage.createFromPdu((byte[]) pdus[0]);
        Log.d("tag","message body : "   messages.getMessageBody());
    }


}
  

Комментарии:

1. [2014-07-06 04:47:04 — Aa] ActivityManager: Запуск: намерение { act=android.intent.action. MAIN cat=[android.intent.category. LAUNCHER] cmp=com.example.aa/.Settings }

2. SMSReceiver не является предопределенным классом… Что должно быть внутри SmsReceiver ?

3. замените SmsReceiver своим классом sms BroadcastReceiver. Это должно быть MainActivity в вашем случае.