2

我一直在寻找这么多,我还没有找到解决方案。从广播接收器发送意图与附加活动(问题与服务)

我的应用程序一直都会拨打一个号码,当它收到一个正好有数字的来电时,它会停止(终止)。 我的想法是:

  1. 活动启动服务,只要调用
  2. 所期待的来电

所以广播接收器的工作,我想使用的BroadcastReceiver杀活动,但我还没有找到任何解决方案。为了尝试另一件事,我试着发送一个附加意图,但附加功能已经变为空。

我打算使用任何解决方案的其他解决方案!

非常感谢你!

更新的代码TO DO裴家努斯鲍姆的建议 我看到的问题是,当它使呼叫的服务,所以我把我所有的代码

这里我的代码:

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); 
    } 

} 

The BroadcastReceiver: package 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: package 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); 
    } 
} 

非常感谢你!

+0

我已经看到,问题出在Service中,所以我添加了代码,希望有任何帮助! – kanashin

回答

1

问题是关于:

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

它停止了接收器,所以我把它改为:

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

如果你想完成一个广播接收器的活动并在你的活动中创建另一个广播接收器来监听特定的意图。然后,在您的第一台广播接收机中,如果您想要终止该活动,请播放您的活动中的接收机正在监听的意图。该接收器将被激活,并可以完成该活动。

下面是一些伪代码:

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); 
    } 
} 
+0

非常感谢。要做到这一点,我做了一些非常类似于[链接](http://stackoverflow.com/questions/4555215/android-broadcastreceiver-within-activity)的东西,它也行不通,不会收到sendBroadcast。也许是来自清单的东西?你有任何使用sendBroadcast和在活动中接收成功的完整例子吗?再次感谢你! – kanashin

+0

不客气,请接受答案,如果你发现它有帮助。 –

+0

感谢您,但仍未解决,我已经使用您的建议更新了第一封邮件中的代码,但仍然无法使用!谢谢! – kanashin