Страница 1 из 1

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

Добавлено: 20 ноя 2014, 17:00
grem17
Тут вот какое дело...
суть программы - через броадкаст перехватываю смс и создаю активность (она не основная в программе)

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

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

что сделано:
в манифесте, для вызываемой активности прописано
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" не в манифесте, может так будет работать?

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

Добавлено: 23 ноя 2014, 14:56
Leeroy
А попробуй вообще убрать лаунчМод android:launchMode="standard"

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

Добавлено: 24 ноя 2014, 08:25
grem17
попробовал, не помогло
вот как выглядит манифест

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

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

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

Добавлено: 26 ноя 2014, 10:38
grem17
помогите если кто чем может, решение до сих пор не могу найти

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

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

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

Добавлено: 27 ноя 2014, 09:17
grem17
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); 
может есть ссылка, где почитать можно?

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

Добавлено: 27 ноя 2014, 14:25
grem17
провел эксперимент, из броадкаста сделал последовательно вызов 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);