2015-07-03 2 views
2

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

Пример: После того, как я уловил двойной щелчок на гарнитуре, нажмите кнопку из основного действия.

Любые предложения о том, как это сделать?

P.D.
Это мое первое приложение на Android, поэтому мне хотелось бы получить от него некоторые отзывы.
Мой телефон Android 4.4.2 на тот случай, если кто-нибудь скажет мне, почему я не использовал MediaSession или что-то еще. (Я знаю registerMediaButtonEventReceiver осуждается)


приемник Класс:

public class MediaReceiver extends BroadcastReceiver { 

    private static int d = 0; 

    public MediaReceiver() { 
    } 

    @Override 
    public void onReceive(final Context context, Intent intent) { 
     String intentAction = intent.getAction(); 
     if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) 
      return; 
     KeyEvent event = (KeyEvent) intent 
       .getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
     int keycode = event.getKeyCode(); 
     int action = event.getAction(); 

     switch (keycode) { 
      case KeyEvent.KEYCODE_HEADSETHOOK: 
       if (action == KeyEvent.ACTION_DOWN) { 
        d++; 

        Handler handler = new Handler(); 
        Runnable r = new Runnable() { 
         @Override 
         public void run() { 
          if (d == 1) { 
           Log.i("Info", "single click!"); 
          } 
          // double click 
          if (d == 2) { 
           Log.i("Info", "double click!"); 

           //handleClick(); this method is inside MainActivity 
          } 
          d = 0; 
         } 
        }; 
        if (d == 1) { 
         handler.postDelayed(r, 400); 
        } 
       } 
       break; 
     } 
     abortBroadcast(); 
    } 
} 


OnCreate MainActivity класс:

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

     txtText = (TextView) findViewById(R.id.status); 
     btnStart = (ImageButton) findViewById(R.id.startButton); 
     focus = (Chronometer) findViewById(R.id.chronometer); 

     btnStart.setBackgroundResource(R.drawable.start_button); 
     focus.setFormat("%s"); 

     manager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     wl = manager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "Proximity screen"); 

     mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     mReceiverComponent = new ComponentName(this, MediaReceiver.class); 

     FillTaskScrollList(); 

     btnStart.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (headsetState == DISABLED_HEADSET_BUTTON) { 
        headsetState = ENABLED_HEADSET_BUTTON; 
        wl.acquire(); 
        ... 
        focus.stop(); 
        focus.setBase(SystemClock.elapsedRealtime()); 
        btnStart.setBackgroundResource(R.drawable.stop_button); 
        mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent); 
       } else { 
        headsetState = DISABLED_HEADSET_BUTTON; 
        wl.release(); 
        ... 
        focus.stop(); 
        btnStart.setBackgroundResource(R.drawable.start_button); 
       } 
      } 
     }); 
    } 

ответ

2

я уже успел решить.

Вы должны использовать другой BroadcastReceiver (внутри класса вам нужно), чтобы поймать сообщение от BroadcastReceiver в другом классе. В моем случае MediaReceiver, поэтому мне пришлось добавить эти строки, чтобы отправить сообщение активности, которую я хотел использовать.


MediaReceive OnReceive()
Вам нужно создать новый Intent, я назвал «android.intent.MAIN», и вы должны добавить сообщение об этом намерении (вы можете сделать это с помощью putExtra [s ] метод).

public void onReceive(final Context context, Intent intent) { 
    ... 
    Intent in = new Intent("android.intent.MAIN") 
    in.putExtra("get_msg", "voice_rec"); 

    context.sendBroadcast(in); 
    ... 
} 


MainActivity

Я объявил новый BroadcastReceiver и добавил onResume/OnPause методы. Создал IntentFilter с тем же именем, что и для Intent, созданного в классе MediaReceive. Это дает вам возможность отправлять сообщения через классы и действия BroadcastReceiver. Остальная часть кода - это то, что вы хотите сделать с этим сообщением, вызовите метод или обновите переменную.

private BroadcastReceiver mIntentReceiver; 

@Override 
protected void onResume() { 
    super.onResume(); 

    IntentFilter intentFilter = new IntentFilter("android.intent.MAIN"); 
    mIntentReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String msg = intent.getStringExtra("get_msg"); 

      } 
     } 
    }; 
    this.registerReceiver(mIntentReceiver, intentFilter); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    this.unregisterReceiver(this.mIntentReceiver); 
} 

Не забывайте о регистрации/отмене регистрации каждого BroadcastReceiver.

Я надеюсь, что это поможет любому, у кого есть проблема, как у меня. Оставьте комментарий.

https://sites.google.com/site/zainozzaini/android/receive-sms-using-android-broadcastreceiver-inside-an-activity

Смежные вопросы