4

更新無法刪除重疊視圖

我能解決這個問題, 的問題是對話和相關可從廣播接收器啓動,但不推薦,因爲活動運行View之前結束。

想實現覆蓋像FB信使,truecaller等

public class IncomingCall extends BroadcastReceiver 
{ 
private Context pcontext; 
private static final String TAG = "CustomBroadcastReceiver"; 
TelephonyManager telephony; 
CustomPhoneStateListener customPhoneListener ; 
@Override 
public void onReceive(Context context, Intent intent) 
{ 
    pcontext = context; 
    Bundle extras = intent.getExtras(); 
    if (extras != null) { 
     String state = extras.getString(TelephonyManager.EXTRA_STATE); 
     Log.w("DEBUG", state); 

      telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
      customPhoneListener = new CustomPhoneStateListener(); 
      telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
      Bundle bundle = intent.getExtras(); 
      String phoneNr= bundle.getString("incoming_number"); 


    } 


} 
public class CustomPhoneStateListener extends PhoneStateListener 
{ 
    private static final String TAG = "CustomPhoneStateListener"; 
    Handler handler=new Handler(); 
    @Override 
    public void onCallStateChanged(int state, String incomingNumber) 
    { 

     WindowManager wm = (WindowManager) pcontext.getSystemService(Context.WINDOW_SERVICE); 

     WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      LayoutParams.MATCH_PARENT, 
      LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT | 
      WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
      WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
      PixelFormat.TRANSPARENT); 

     params.height = LayoutParams.MATCH_PARENT; 
     params.width = LayoutParams.MATCH_PARENT; 
     params.format = PixelFormat.TRANSLUCENT; 

     params.gravity = Gravity.BOTTOM; 

     RelativeLayout ly; 
     final LayoutInflater inflater = (LayoutInflater) pcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     ly = (RelativeLayout) inflater.inflate(R.layout.dialog, null); 

     switch (state) 
     { 
     case TelephonyManager.CALL_STATE_RINGING: 
      Log.d("Call","RINGING"); 

      wm.addView(ly, params); 
      break; 

     case TelephonyManager.CALL_STATE_IDLE: 

       Log.d("Call","End"); 
       //WindowManager wm = (WindowManager) pcontext.getSystemService(Context.WINDOW_SERVICE); 

       if(ly!=null) 
       { 
        wm.removeView(ly); 
        ly = null; 
       } 
      break; 
     default: 
      break; 
     } 
     super.onCallStateChanged(state, incomingNumber); 
     telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_NONE); 
    } 


}  
} 

的addView工作正常, 這裏是日誌

「查看未連接到窗口管理器」

08-24 20:05:56.404: W/DEBUG(28001): IDLE 
08-24 20:05:56.424: D/Call(28001): End 
08-24 20:05:56.424: D/AndroidRuntime(28001): Shutting down VM 
08-24 20:05:56.424: W/dalvikvm(28001): threadid=1: thread exiting with uncaught exception (group=0x412982a0) 
08-24 20:05:56.444: E/AndroidRuntime(28001): FATAL EXCEPTION: main 
08-24 20:05:56.444: E/AndroidRuntime(28001): java.lang.IllegalArgumentException: View not attached to window manager 
08-24 20:05:56.444: E/AndroidRuntime(28001): at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:673) 
08-24 20:05:56.444: E/AndroidRuntime(28001): at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:369) 
08-24 20:05:56.444: E/AndroidRuntime(28001): at android.view.WindowManagerImpl$CompatModeWrapper.removeView(WindowManagerImpl.java:160) 
08-24 20:05:56.444: E/AndroidRuntime(28001): at com.androidexample.broadcastreceiver.IncomingCall$CustomPhoneStateListener.onCallStateChanged(IncomingCall.java:105) 
08-24 20:05:56.444: E/AndroidRuntime(28001): at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:393) 
08-24 20:05:56.444: E/AndroidRuntime(28001): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-24 20:05:56.444: E/AndroidRuntime(28001): at android.os.Looper.loop(Looper.java:137) 
08-24 20:05:56.444: E/AndroidRuntime(28001): at android.app.ActivityThread.main(ActivityThread.java:4898) 
08-24 20:05:56.444: E/AndroidRuntime(28001): at java.lang.reflect.Method.invokeNative(Native Method) 
08-24 20:05:56.444: E/AndroidRuntime(28001): at java.lang.reflect.Method.invoke(Method.java:511) 
08-24 20:05:56.444: E/AndroidRuntime(28001): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008) 
08-24 20:05:56.444: E/AndroidRuntime(28001): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775) 
08-24 20:05:56.444: E/AndroidRuntime(28001): at dalvik.system.NativeStart.main(Native Method) 
08-24 20:08:22.669: I/Process(28001): Sending signal. PID: 28001 SIG: 9 

我曾嘗試創建佈局programmaticaly太.. 但沒有運氣

也找不到生成的佈局的編號

+0

我從來沒有嘗試過直接通過broadcastReceiver。我一直在開新的活動,並在那裏展示了重疊視圖。請嘗試一下。這裏是如何顯示我最近寫的頂視圖片段:http://stackoverflow.com/questions/18424613/cannot-click-on-edittext-after-adding-it-to-windowmanager/18433366# 18433366 –

+0

但是,這將能夠完成從廣播接收機的另一個國家的活動 –

+0

我知道我可以刪除該活動的銷燬視圖 –

回答

3

問題是,我們不能在廣播接收器中使用對話框,它必須在另一個可以以意圖開始的活動。

1

當BroadcastReceiver正在接收Intent廣播時調用此方法。在此期間,您可以使用BroadcastReceiver上的其他方法查看/修改當前結果值。除非您明確要求使用registerReceiver(BroadcastReceiver,IntentFilter,String,android.os.Handler)在其他線程上調度此方法,否則此方法始終在其進程的主線程中調用。當它在主線程上運行時,您不應該在其中執行長時間運行的操作(在考慮接收器被阻塞並且候選者被終止之前系統允許超時10秒)。你不能在你的onReceive()的實現中啓動一個彈出對話框。

Android文檔清楚地說明了這一點。

Android Documentation on BroadcastReceiver

+0

謝謝亞歷克斯,實際上我已經注意到了。 –