UMS_CONNECTED 류와 MEDIA_MOUNTED 류의 intent들을 사용하여 

PC에 USB연결 시, 혹은 폰에 SD Card 탈착 시, Toast 메시지를 띄우는 테스트 프로그램을 작성 중,

그 사용법이 달라, 왜 달라야 하는지 질문드립니다.

먼저, UMS(USB)와 관련된 intent들은 XML Manifest에 Receiver에 intent filter 부분에서 action을 정의해 놓고 

이를 BroadcastReceiver를 상속받은 별도의 Class에서 onReceive를 통해 처리해야 올바르게 동작합니다.

그러나 이를 Activity에서 Intent Filter를 동적으로 생성해 Add Action해서 onReceive 할 경우 동작을 하지 않습니다.

반대로 MEDIA(SDCard)와 관련된 intent들은 Activity에서 동적으로 IntentFilter를 생성하여 각 action들을 Add해 주고 

이를 onReceive에서 처리해야 올바르게 작동합니다.

만약 UMS처럼 XML Manifest에 정의 후 이를 별도의 Class에서 Receiver를 통해 처리하려고 할 경우 동작을 하지 않습니다.

이 둘의 차이가 어디서 오는지 궁금합니다.
XML Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".IntentTest"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>       
        <receiver android:name="com.Receiver">
         <intent-filter>
          <action android:name="android.intent.action.UMS_CONNECTED" />
          <action android:name="android.intent.action.UMS_DISCONNECTED" />
         </intent-filter>
        </receiver>
    </application>
    <uses-sdk android:minSdkVersion="4" />
</manifest> 
 

Receiver.java
package com;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class Receiver extends BroadcastReceiver {
 public void onReceive(Context context, Intent intent) {
  if(intent.getAction().equals(intent.ACTION_UMS_CONNECTED)) {
   Toast.makeText(context, "USB Connected", Toast.LENGTH_LONG).show();
  }
  
  if(intent.getAction().equals(intent.ACTION_UMS_DISCONNECTED)) {
   Toast.makeText(context, "USB Disconnected", Toast.LENGTH_LONG).show();
  }
 }
}

IntentTest.java
package com;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class IntentTest extends Activity {
    /** Called when the activity is first created. */
 
 BroadcastReceiver mReceiver1 = null;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        
     // install an intent filter to receive SD card related events.
        IntentFilter intentFilter1 = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED);
        intentFilter1.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
        intentFilter1.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
        intentFilter1.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
        intentFilter1.addAction(Intent.ACTION_MEDIA_EJECT);
        intentFilter1.addDataScheme("file");
        
        mReceiver1 = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
                 Toast.makeText(context, "SD Card mounted", Toast.LENGTH_LONG).show();
                 
                } else if (action.equals(Intent.ACTION_MEDIA_UNMOUNTED)) {
                    Toast.makeText(context, "SD Card unmounted", Toast.LENGTH_LONG).show();
                    
                } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_STARTED)) {
                    Toast.makeText(context, "SD Card scanner started", Toast.LENGTH_LONG).show();
                       
                } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) {
                 Toast.makeText(context, "SD Card scanner finished", Toast.LENGTH_LONG).show();
                    
                } else if (action.equals(Intent.ACTION_MEDIA_EJECT)) {
                 Toast.makeText(context, "SD Card eject", Toast.LENGTH_LONG).show();
                    
                }
            }
        };
        registerReceiver(mReceiver1, intentFilter1);
    }
}


추가로 궁금한 것은 위와 같은 구조로 어플을 작성하였을시, Receiver 클래스의 Instance 어떤방식으로

현재 실행중이 Activity(IntentTest)의 Method를 호출할 수 있을지 궁금합니다.

감사합니다.