Можно ли программно изменить Manifest?

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Можно ли программно изменить Manifest?

Сообщение grem17 » 20 ноя 2014, 17:00

Тут вот какое дело...
суть программы - через броадкаст перехватываю смс и создаю активность (она не основная в программе)

если окно основной программы открыто и приходит несколько смс, то через броадкаст вызывается несколько вариантов активностей - мне так и надо

но когда основная программа закрыта и приходит несколько смс - то копии активити почему то не создаются (только одна)

что сделано:
в манифесте, для вызываемой активности прописано
android:launchMode="standard"

из броадкаста вызов делаю вот так:

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

           Intent mIntent = new Intent(context, SmsWindow.class);
 	   mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           mIntent.putExtra("NomerSMS", NomerSMS);
           mIntent.putExtra("BodySMS", BodySMS);
           context.startActivity(mIntent);
как решить проблему вызова копии активности, при закрытой основной программе? пробовал запуск делать через сервис - не вышло. Предпологаю что при закрытой программе не считывается манифест, можно ли как то задать у активности свойство android:launchMode="standard" не в манифесте, может так будет работать?

Аватара пользователя
Leeroy
Сообщения: 67
Зарегистрирован: 12 дек 2013, 21:25

Re: Можно ли программно изменить Manifest?

Сообщение Leeroy » 23 ноя 2014, 14:56

А попробуй вообще убрать лаунчМод android:launchMode="standard"
Java Core -> JDBC -> GoF -> Android SDK ->...
Телепрограмма в твоем смарте Телепрограмма

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: Можно ли программно изменить Manifest?

Сообщение grem17 » 24 ноя 2014, 08:25

попробовал, не помогло
вот как выглядит манифест

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

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

    <uses-sdk
        android:minSdkVersion="13"
        android:targetSdkVersion="21" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.WRITE_SMS"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.VIBRATE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" 
        android:debuggable="false">
        <activity
            android:name="ru.test.prog.MainActivity"
            android:theme="@android:style/Theme.Dialog">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <activity android:name=".SmsWindow" 
            android:label="@string/title_sms_window"
            android:theme="@android:style/Theme.Dialog">
        </activity>
        
        <activity android:name=".Help"
            android:label="@string/help"
            android:theme="@android:style/Theme.Dialog">
        </activity>       
        
        <receiver
            android:name="ru.test.prog.MessageReceiver">
            <intent-filter android:priority="999" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" >
                </action>
 
            </intent-filter>
        </receiver>
    </application>

</manifest>
единственный вариант который приходит в голову - это сделать прогу как сервис, может тогда манифест будет в памяти подгружен постоянно и вызов окна будет происходить через сервис...в общем попробую, потом отпишусь

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: Можно ли программно изменить Manifest?

Сообщение grem17 » 26 ноя 2014, 10:38

помогите если кто чем может, решение до сих пор не могу найти

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Можно ли программно изменить Manifest?

Сообщение doter.ua » 26 ноя 2014, 11:03

В главном активити создаешь список. Когда приходит интент
public void onReceiveIntent(Context context, Intent intent)
проверяешь на экшен (показывает кто вызвал, т.е. СМСка)
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { желательно вместо явного текста экшена использовать константу.
добавляешь в список СМСку, сейвишь где-нибудь нужную инфу (текст смс).
и по клику на элемент списка открываешь Активити, которое будет вызываться для всех таких кликов. Ибо нефиг создавать 100500 активностей. Юзер не супермэн - не сможет читать 10 смс одновременно, а память активностями засоряется.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: Можно ли программно изменить Manifest?

Сообщение grem17 » 27 ноя 2014, 09:17

doter.ua
идею понял, реализацию - нет
броадкаст перехватывает входящую смс, передает данные в другой класс и запускает его активити, тут все понятно...
допустим одновременно, или с интервалом в 1 сек., поступает вторая смс, как передать данные в уже запущенное активити и обработать их там? не понимаю...

вызов из броадкаста сейчас реализован вот так

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

Intent mIntent = new Intent(context, SmsWindow.class); 
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
mIntent.putExtra("NomerSMS", NomerSMS); 
mIntent.putExtra("BodySMS", BodySMS); 
context.startActivity(mIntent); 
может есть ссылка, где почитать можно?

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: Можно ли программно изменить Manifest?

Сообщение grem17 » 27 ноя 2014, 14:25

провел эксперимент, из броадкаста сделал последовательно вызов 3х активити - сработало без запущенной основной программа, теперь надо придумать, как первую запускать со значением ACTION_MAIN, а остальные ACTION_DEFAULT

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

 	   Intent mIntent = new Intent(Intent.ACTION_MAIN, null, context, SmsWindow.class);
           mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           mIntent.putExtra("NomerSMS", NomerSMS);
           mIntent.putExtra("BodySMS", BodySMS);
           mIntent.putExtra("TimeSMSsent", TimeSMSsent);
           mIntent.putExtra("TimeNow", TimeNow);
           mIntent.putExtra("ServCentr", ServCentr);
           context.startActivity(mIntent);
           
 	   Intent m = new Intent(Intent.ACTION_DEFAULT, null, context, SmsWindow.class);
           m.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           m.putExtra("NomerSMS", NomerSMS);
           m.putExtra("BodySMS", BodySMS);
           m.putExtra("TimeSMSsent", TimeSMSsent);
           m.putExtra("TimeNow", TimeNow);
           m.putExtra("ServCentr", ServCentr);
           context.startActivity(m); 
           
 	   Intent m1 = new Intent(Intent.ACTION_DEFAULT, null, context, SmsWindow.class);
           m1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           m1.putExtra("NomerSMS", NomerSMS);
           m1.putExtra("BodySMS", BodySMS);
           m1.putExtra("TimeSMSsent", TimeSMSsent);
           m1.putExtra("TimeNow", TimeNow);
           m1.putExtra("ServCentr", ServCentr);
           context.startActivity(m1);

Ответить