Модераторы: javastic
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка перехода после запуска BroadcastReceiver, Переход на Home Screen (ошибка) 
:(
    Опции темы
CaptainNemo
Дата 3.4.2011, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 5.6.2008
Где: White Russia, Min sk

Репутация: 3
Всего: 9



Может быть неверно сформулировал в заголовке темы. Но чует моя душа, что ошибка выскакивает из-за того, что запущен BroadcastReceiver. 

Ситуация такова: в приложении, которое пишу, все работает ок. Там два активити. Основное и отправки СМС. Если ходить по автивити проблем нет. Но как только отправлю СМС - начинаются проблемы с выходом на Home Screen. Пытался прописывать программно выход из приложения и т.п. - все равно ошибка. Может кто сталкивался с подобным? 


PM MAIL WWW ICQ Skype GTalk   Вверх
ivanovpv
Дата 4.4.2011, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 9
Всего: 28



Сложно судить без кода... Жизнь с несколькими активити вообще довольно сложна (если не знать как) - запросто можно нарваться на утечку памяти, которое все обрушит... 



--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
CaptainNemo
Дата 27.4.2011, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 5.6.2008
Где: White Russia, Min sk

Репутация: 3
Всего: 9



ivanovpv, 

Цитата

Сложно судить без кода... 


(Часть кода выдираю, а то не получается отправить...)


Основное активити приложения. У меня оно является слушателем нажатия кнопки, и в зависимости от того, какая кнопка нажата, вытягивает из strings нужную информацию и в три шага (два диалога + данные из стрингс) отправляет данные во второе активити
Код


package sms.android.banking;



public class StartActivity extends Activity implements OnClickListener {
    
    private static final String TAG = null;

   

    
    /*----------------------Запуск меню Options---------------------*/
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        setMenuBackground();
        return true;
    }
    
  
    protected void setMenuBackground(){

        Log.d(TAG, "Enterting setMenuBackGround");
        getLayoutInflater().setFactory( new Factory() {

            @Override
            public View onCreateView ( String name, Context context, AttributeSet attrs ) {

                if ( name.equalsIgnoreCase( "com.android.internal.view.menu.IconMenuItemView" ) ) {

                    try { // Ask our inflater to create the view
                        LayoutInflater f = getLayoutInflater();
                        final View view = f.createView( name, null, attrs );
                       
                        new Handler().post( new Runnable() {
                            public void run () {
                                view.setBackgroundResource( R.drawable.menu_bg);
                            }
                        } );
                        return view;
                    }
                    catch ( InflateException e ) {}
                    catch ( ClassNotFoundException e ) {}
                }
                return null;
            }
        });
    }

    
    
    
    /*Обработка выбора пунктов Меню*/
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        
        case R.id.settings:StartActivity.this.finish();
             Intent intent = new Intent(StartActivity.this, 
             SettingsScreen.class);
                startActivity(intent);    
                finish();
             break;

        case R.id.my_help:     
            final Dialog help = new Dialog(this);
             help.setContentView(R.layout.help);
             help.setTitle("SMS-Banking BY HELP!");
             help.setCancelable(true);

             Button cancelButton = (Button) 
                     help.findViewById(R.id.dialog_cancel);
          cancelButton.setOnClickListener(new OnClickListener() {
                   public void onClick(View v) {
                          help.dismiss();}});
                              help.show();
                              break;

        case R.id.about: 
         final Dialog dialog = new Dialog(this);
         dialog.setContentView(R.layout.about_dialog);
         dialog.setTitle("SMS-Banking BY");
         dialog.setCancelable(true);
         
      
         Button mailTo = (Button) dialog.findViewById(R.id.mail_to);
         mailTo.setOnClickListener(new OnClickListener() {
                  public void onClick(View v) {
                  Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
                  String[] recipients = new String[]{"[email protected]",""};
                  emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, recipients);
                  emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, getString(R.string.app_name));
                  emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Сообщение...");
                  emailIntent.setType("text/plain");
                  startActivity(Intent.createChooser(emailIntent, "Отправить письмо..."));

                 finish();          
         }
                 
    });
         
         Button cnslButton = (Button) dialog.findViewById(R.id.dialog_cancel);
              cnslButton.setOnClickListener(new OnClickListener() {
                       public void onClick(View v) {
                              dialog.dismiss();
                   
              }
                      
         });
              
         //finally show the dialog
         dialog.show();
         
         
         break;
         
        }
        return true;
    }
    

    
    /* --------------------вытягиваем данные из Preferences----------------*/
    SharedPreferences preferences;
    
    @Override
    public void onCreate(Bundle savedInstanceState)    {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        
        /*LayoutInflater inflater = getLayoutInflater();
        LinearLayout content = (LinearLayout) inflater.inflate(R.layout.main, null);*/

    
            
        preferences = PreferenceManager.getDefaultSharedPreferences(this);
        

        Button Agrbnk_btn=(Button)findViewById(R.id.agrbnk_btn);
        Agrbnk_btn.setOnClickListener(this);
        
        Button Mts_btn=(Button)findViewById(R.id.mts_btn);
        Mts_btn.setOnClickListener(this);
        
        Button Vel_btn=(Button)findViewById(R.id.vel_btn);
        Vel_btn.setOnClickListener(this);
        
        
        Button Life_btn=(Button)findViewById(R.id.life_btn);
        Life_btn.setOnClickListener(this);
        
        Button Dialog_btn=(Button)findViewById(R.id.dialog_btn);
        Dialog_btn.setOnClickListener(this);
        
        
        Button Ds_btn=(Button)findViewById(R.id.ds_btn);
        Ds_btn.setOnClickListener(this);
        
        Button Byfly_btn=(Button)findViewById(R.id.byfly_btn);
        Byfly_btn.setOnClickListener(this);
        
                    
    }
    
    
    /*-- ------------------обработчик операции Oplata---------------------------*/
    
    public void myAlertDialogs(final String identificator, final String data_payment){
        
        /*диалог ввода суммы оплаты*/
        AlertDialog.Builder alert_sum = new AlertDialog.Builder(this);
        
        alert_sum.setTitle("Оплата услуг");
        alert_sum.setMessage("Введите сумму оплаты");
        alert_sum.setIcon(R.drawable.bel_rub);
        
        
        final EditText input_sum = new EditText(this);
        input_sum.setInputType(InputType.TYPE_CLASS_NUMBER);
        alert_sum.setView(input_sum);
        input_sum.setText(preferences.getString("sum_def_data", "n/a"));
        input_sum.setTextColor(Color.BLUE);
        
        final Editable summa = input_sum.getText();
        alert_sum.setPositiveButton("Подтвердить",
                new DialogInterface.OnClickListener() {    
            
        
            
        public void onClick(DialogInterface dialog, int whichButton) {
            
                  
            
                    AlertDialog.Builder alert_phn_num = new AlertDialog.Builder(StartActivity.this);
                    alert_phn_num.setTitle("Оплата услуг");
                    alert_phn_num.setMessage 
                ("Введите номер лицевого счета или номер оплачиваемого телефона в формате 29#######");
                    
                    final EditText input = new EditText(StartActivity.this);
                    input.setInputType(InputType.TYPE_CLASS_NUMBER);
                    alert_phn_num.setView(input);
                    alert_phn_num.setIcon(R.drawable.u8230);
                    input.setText(data_payment);
                    input.setTextColor(Color.BLUE);
                    
                    
                    alert_phn_num.setPositiveButton("Подтвердить", new DialogInterface.OnClickListener() {            
                    
                    public void onClick(DialogInterface dialog, int whichButton) {
                        Editable number = input.getText();   
                        Intent intent = new Intent();
                        intent.setClass(StartActivity.this, SMS.class);
                        intent.putExtra(SMS.EXT_PHONE_NUMBER,preferences.getString("num_def_data", "1250"));
                        intent.putExtra(SMS.EXT_INQUIRY, getString(R.string.opl_str)+" "+preferences.getString("pas_data","")+" "+
                                summa+" "+identificator+" "+number);
                        startActivity(intent); 
                        finish();}}
                    );                
                        alert_phn_num.setNegativeButton("Отменить", new DialogInterface.OnClickListener() {                    
                            public void onClick(DialogInterface dialog, int whichButton) {}    });
                        alert_phn_num.show();}});
        
            
    
        
        alert_sum.setNegativeButton("Отменить", new DialogInterface.OnClickListener() {                    
            public void onClick(DialogInterface dialog, int whichButton) {}});
        alert_sum.show();
        
    }

/*-------- обработка нажатия кнопок на основной форме----------------*/

    public void onClick(View v) {
        switch (v.getId()){
        
        /*data_payment - это номер оплачиваемого телефона или лицевого счета*/
        case R.id.agrbnk_btn:{
                            Intent intent = new Intent();
                            intent.setClass(this, SMS.class);
                            startActivity(intent); 
                            finish();
                            
                            intent.putExtra(SMS.EXT_PHONE_NUMBER, preferences.getString("num_def_data", "1250")); 
                            intent.putExtra(SMS.EXT_INQUIRY,getString(R.string.ost_str)+" "+preferences.getString("pas_data","")); 
                            startActivity(intent); 
                            finish();
                break;
            }

                        
                            
                case R.id.mts_btn:{    
                    
                
                    String identificator=getString(R.string.mts_str);
                    String data_payment=preferences.getString("mts_data","");
                    myAlertDialogs(identificator,data_payment);
                    
                break;
            }
                
                
                case R.id.vel_btn:{
                                    
                    
                    String identificator=getString(R.string.vel_str);
                    String data_payment=preferences.getString("vel_data","");
                    myAlertDialogs(identificator,data_payment);
                break;
            }
                
                case R.id.life_btn:{
                                    
                    
                    String identificator=getString(R.string.life_str);
                    String data_payment=preferences.getString("life_data","");
                    myAlertDialogs(identificator,data_payment);
                break;
            }
                case R.id.dialog_btn:{
                                    
                    
                    String identificator=getString(R.string.dialog_str);
                    String data_payment=preferences.getString("dialog_data","");
                    myAlertDialogs(identificator,data_payment);
                break;
            }
                    
                case R.id.ds_btn:{
                    String identificator=getString(R.string.dst_str);
                    String data_payment=preferences.getString("dst_data","");
                    myAlertDialogs(identificator, data_payment);
                break;
            }
                
                    
                case R.id.byfly_btn:{
                    String identificator=getString(R.string.tel_str);
                    String data_payment=preferences.getString("bf_data","");
                
                    myAlertDialogs(identificator, data_payment);            
                    break;
            }    
                
                    default:
                    break;
            }
    }
    
}
    




Добавлено @ 17:16
Второе активити получает этот поток, и на нём одна кнопка. При нажатии идет отправка СМС и в Тостах отображается ход данной операции (отправлено, доставлено и т.п.)

Код

package sms.android.banking;

public class SMS extends Activity 
{
    public static final String EXT_PHONE_NUMBER="phone_number";    
    public static final String EXT_INQUIRY = "inquiry";
    
    
    ProgressDialog pleaseWaitDialog;

    Button btnSendSMS;
    EditText txtPhoneNo;
    EditText txtMessage;
        
     public void myProgressDialog(final String contProgress){
         ProgressDialog pleaseWaitDialog = ProgressDialog.show(this,"Отправка СМС-сообщения",contProgress, true);  
    
        pleaseWaitDialog.setIcon(R.drawable.sms_send);
         
        };
    
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sender);
        Bundle extras = getIntent().getExtras(); 
        String phone_number=extras.getString(EXT_PHONE_NUMBER);
     String inquiry=extras.getString(EXT_INQUIRY);
          
        btnSendSMS = (Button)findViewById(R.id.btnSendSMS);
        txtPhoneNo = (EditText) findViewById(R.id.txtPhoneNo);
        txtPhoneNo.setText(phone_number);
        txtMessage=(EditText) findViewById(R.id.txtMessage);
        txtMessage.setText(inquiry);                
        
        btnSendSMS.setOnClickListener(new View.OnClickListener()
        {
 public void onClick(View v) 
            {                
    String phoneNo = txtPhoneNo.getText().toString();
    String message = txtMessage.getText().toString(); 
    
    String sms_start=getString(R.string.progress_cont_sms_send_start);
    myProgressDialog(sms_start);
    
    if (phoneNo.length()>0 && message.length()>0)                
    sendSMS(phoneNo, message);                
    else
    Toast.makeText(getBaseContext(), 
    "Введите текст сообщения и номер", 
    Toast.LENGTH_SHORT).show();
            }
        });   
    }
  //---отправка СМС-сообщения--
   
     
        //---когда СМС-сообщение доставлено---
        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                     
                     String res_ok=getString(R.string.progress_cont_res_ok);
                     myProgressDialog(res_ok);
                     
                        Toast.makeText(getBaseContext(), "СМС-сообщение доставлено", 
                             Toast.LENGTH_SHORT).show();
                        break;
                        
                    case Activity.RESULT_CANCELED:
                     
                     String res_cancel=getString(R.string.progress_cont_res_cancel);
                     myProgressDialog(res_cancel);
                     
                        Toast.makeText(getBaseContext(), "СМС-сообщение не доставлено!", 
                             Toast.LENGTH_SHORT).show();
                        break;                        
                }
            }
        }, new IntentFilter(DELIVERED));        
     
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);               
    }


    
    /* Обрабатываем нажатие hard-кнопок телефона*/
   
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    super.onKeyDown(keyCode, event);
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                    SMS.this.finish();
                    
        Intent intent = new Intent(this, StartActivity.class)
        .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        finish();  
        startActivity(intent);    
        finish();}
            else if (keyCode == KeyEvent.KEYCODE_MENU) {
                SMS.this.finish();
                Intent intent = new Intent(SMS.this, SettingsScreen.class);
                startActivity(intent);    
                finish();}
            else if (keyCode == KeyEvent.KEYCODE_HOME) {
              SMS.this.finish();
                 Intent intent = new Intent(SMS.this, StartActivity.class);
                 startActivity(intent);    
                 finish();    
            }
                            
            return false;
        }
    
}



Затем вызывается Броудкаст ресивер и слушает входящее СМС. Отображает его в Тосте

Код я уже постил тут

Это сообщение отредактировал(а) CaptainNemo - 27.4.2011, 17:24
PM MAIL WWW ICQ Skype GTalk   Вверх
CaptainNemo
Дата 27.4.2011, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 5.6.2008
Где: White Russia, Min sk

Репутация: 3
Всего: 9



Может есть какая-либо волшебная команда, типа BroadcastReciever.Stop или Quit .... и ли что-нибуд в этом роде. 

Что бы повесить эту строчку кода в конце обработки события - onReceive


Код

onReceive(Context context, Intent intent) {
.........

BroadcastReciever.Quit
}

Так, что бы получилось перехватить входящее СМС и выключить броудкаста. Я не наблюдал этой ошибки, пока он не запущен....
PM MAIL WWW ICQ Skype GTalk   Вверх
ivanovpv
Дата 28.4.2011, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 9
Всего: 28



Цитата(CaptainNemo @  28.4.2011,  00:39 Найти цитируемый пост)
Так, что бы получилось перехватить входящее СМС и выключить броудкаста. Я не наблюдал этой ошибки, пока он не запущен.... 

Попробуй вызвать
Код

Context.unregisterReceiver(BroadcastReceiver);

правда для этого надо будет BroadcastReceiver вывести из-под анонимности


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
CaptainNemo
Дата 29.4.2011, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 5.6.2008
Где: White Russia, Min sk

Репутация: 3
Всего: 9



ivanovpv, 
Цитата

правда для этого надо будет BroadcastReceiver вывести из-под анонимности 

А как это сделать? Или где подсмотреть, как это делается? 
PM MAIL WWW ICQ Skype GTalk   Вверх
ivanovpv
Дата 29.4.2011, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 9
Всего: 28



Цитата(CaptainNemo @  29.4.2011,  12:57 Найти цитируемый пост)
А как это сделать? Или где подсмотреть, как это делается?  


Объяви в отдельном файле класс наследующий от BroadcastReceiver и регистрируй его как получателя броудкастов


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Android | Следующая тема »


 




[ Время генерации скрипта: 0.5364 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.