从广播接收器向附加活动发送意图(服务问题)

时间:2011-11-16 20:26:31

标签: android service android-activity android-intent broadcastreceiver

我一直在寻找那么多而且我找不到解决方案。

我的应用程序一直拨打一个号码,当它收到一个确切号码的来电时,它会停止(死掉)。 我的想法是:

  1. 活动启动执行调用
  2. 工作的服务
  3. 期待来电的BroadcastReceiver
  4. 所以,我想使用BroadcastReceiver来杀死Activity,但我还没有找到任何解决方案。为了尝试另一件事,我尝试发送Intent with Extras但Extras已变为null。

    我愿意使用任何解决它的解决方案!

    非常感谢你!

    更新代码以推荐Kurtis Nusbaum 我看到问题出在服务时,所以我把所有代码

    这是我的代码:

    package com.comunicacio;
    
    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;
    
    public class Comunicacio extends Activity {
    
        IntentFilter filter;
    
        private BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.i("BYE", "OOOOOOOOOOOOK");
                finish();
            }
        };
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            filter = new IntentFilter();
            filter.addAction("com.comunicacio.FINALITZAR");
    
            startService(new Intent(this, Servicio.class));
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            registerReceiver(receiver, filter);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            unregisterReceiver(receiver);
        }
    
    }
    

    BroadcastReceiver:     包com.comunicacio;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.telephony.TelephonyManager;
    import android.util.Log;
    
    public class DetectarCridada extends BroadcastReceiver {
        public static final String CUSTOM_INTENT = "com.comunicacio.FINALITZAR";
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle = intent.getExtras();
    
            if (bundle == null)
                return;
    
            String state = bundle.getString(TelephonyManager.EXTRA_STATE);
    
            if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) {
                String phonenumber = bundle
                        .getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
    
                Log.i("BYE", "UUUUUUUUUUUUUUUUL");
    
                // if (es_acceptat(phonenumber)) {
                Intent i = new Intent();
                i.setAction(CUSTOM_INTENT);
                context.sendBroadcast(i);
                // }
            }
        }
    
        private boolean es_acceptat(String telefono) {
            if (telefono.equals("123"))
                return true;
            return false;
        }
    }
    

    并且清单:          

        <uses-sdk android:minSdkVersion="10" />
    
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >
            <activity
                android:label="@string/app_name"
                android:name="Comunicacio" >
                <intent-filter >
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <receiver android:name=".DetectarCridada" >
                <intent-filter >
                    <action android:name="android.intent.action.PHONE_STATE" />
                </intent-filter>
            </receiver>
            <service
                android:enabled="true"
                android:name=".Servicio" />
    
            <activity android:name=".Call" />
        </application>
    
        <uses-permission android:name="android.permission.CALL_PHONE" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    </manifest>
    

    服务Sercivio.java:     包com.comunicacio;

    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.os.IBinder;
    import android.telephony.PhoneStateListener;
    import android.telephony.TelephonyManager;
    import android.util.Log;
    import android.widget.Toast;
    
    public class Servicio extends Service {
        private static final String TAG = "MyService";
        boolean hem_cridat = false;
        int telefono = 123;
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onCreate() {
            Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
            Log.d(TAG, "onCreate");
            EndCallListener callListener = new EndCallListener();
            TelephonyManager mTM = (TelephonyManager) this
                    .getSystemService(Context.TELEPHONY_SERVICE);
            mTM.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE);
        }
    
        @Override
        public void onDestroy() {
            Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
        }
    
        @Override
        public void onStart(Intent intent, int startid) {
            Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
            call();
        }
    
        private class EndCallListener extends PhoneStateListener {
            private static final String LOG_TAG = "Comunicacio:";
    
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                switch (state) {
                case TelephonyManager.CALL_STATE_RINGING:
                    Log.i(LOG_TAG, "RINGING, number: " + incomingNumber);
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    Log.i(LOG_TAG, "OFFHOOK");
                    hem_cridat = true;
                    break;
                case TelephonyManager.CALL_STATE_IDLE:
                    Log.i(LOG_TAG, "IDLE");
                    if (hem_cridat) {
                        hem_cridat = false;
                        try {
                            Log.i(LOG_TAG, "Cridant!");
                            call();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                }
            }
        }
    
        private void call() {
        /* THE PROBLEM IS THERE !!! If I don't do that, it works! */
        /*  Intent i = new Intent(getBaseContext(), Call.class);
            i.putExtra("NUMERO", telefono);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            getApplication().startActivity(i);
            ++telefono; */
        }
    }
    

    最后是Call.java:     包com.comunicacio;

    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    
    public class Call extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Bundle b = getIntent().getExtras();
            Intent i = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"
                    + b.getInt("NUMERO")));
            startActivity(i);
        }
    }
    

    非常感谢你!

2 个答案:

答案 0 :(得分:4)

如果您想完成广播接收器的活动和活动,请在您的活动中创建另一个侦听特定意图的广播接收器。然后在您的第一个广播接收器中,当您想要杀死该活动时,广播您的活动中的接收者正在侦听的Intent。然后该接收器将被激活并且可以完成所有活动。

这是一些伪代码:

public class YourActivity extends Activity{

  private class CloseLisntener extends BroadcastReceiver{
    onReceive(Contetxt context, Intent intent){
      YourActivity.this.finish();
    }
  }

  private CloseListener closeListener;

  protected void onCreate(Intent icicle){
     closeListener = new CloseListener();
     // other on create stuff
  }

  protected void onResume(){
     registerReceiver(closeListener, /* Your intent filter goes here */);
  }

  protected void onPause(){
    unregisterReceiver(closeListener);
  }
}

答案 1 :(得分:1)

问题出现了:

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

它停止了接收器,因此我将其更改为:

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receiver);
}