2016-10-11 115 views
0

我有這樣的問題: 我的應用程序訂閱Intent.SCREEN_ON事件,但在某些情況下它會產生錯誤的效果。如何檢測 - SCREEN_ON是由按鈕(用戶按下電源按鈕)還是其他任何(來自whatsapp的報警,來電,通知)引起的?可能嗎?事件來源(SCREEN_ON)

回答

0

不,這是不可能的。

每個廣播的核心是一個Intent。如果這樣的壯舉是可能的,那麼我們應該在他們的某處看到所需的信息。

但是,如果你看一看Intent的soucre,這些定義的唯一領域:

private String mAction; 
    private Uri mData; 
    private String mType; 
    private String mPackage; 
    private ComponentName mComponent; 
    private int mFlags; 
    private HashSet<String> mCategories; 
    private Bundle mExtras; 

你看,這些領域之間有沒有真正一個可以告訴我們關於發送任何東西。

0

你甚至可以在SCREEN ON檢測。

MyApp的:

public class MyApp extends Application { 

@Override 
public void onCreate() { 
    super.onCreate(); 
    registerKioskModeScreenOnReceiver(); 
} 
private PowerManager.WakeLock wakeLock; 
public OnScreenOnReceiver onScreenOnReceiver; 




private void registerKioskModeScreenOnReceiver() { 
    // register screen off receiver 
    final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
    onScreenOnReceiver = new OnScreenOnReceiver(); 
    registerReceiver(onScreenOnReceiver, filter); 
} 

public PowerManager.WakeLock getWakeLock() { 
    if(wakeLock == null) { 
     // lazy loading: first call, create wakeLock via PowerManager. 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "wakeup"); 
    } 
    return wakeLock; 
} 
} 

OnScreenOnReceiver接收器:

public class OnScreenOnReceiver extends BroadcastReceiver { 
private static final String PREF_KIOSK_MODE = "pref_kiosk_mode"; 
Listener listener; 
@Override 
public void onReceive(Context context, Intent intent) { 
    if(Intent.ACTION_SCREEN_ON.equals(intent.getAction())){ 

     Log.e("tag", "screeneee:" + intent.getAction()); 
     MyApp ctx = (MyApp) context.getApplicationContext(); 
     // is Kiosk Mode active? 
     if(isKioskModeActive(ctx)) { 
      wakeUpDevice(ctx); 

     } 
     if(listener!=null) 
      listener.onPower(); 

    } 
} 


private void wakeUpDevice(MyApp context) { 
    PowerManager.WakeLock wakeLock = context.getWakeLock(); // get WakeLock reference via AppContext 
    if (wakeLock.isHeld()) { 
     wakeLock.release(); // release old wake lock 
    } 

    // create a new wake lock... 
    wakeLock.acquire(); 

    // ... and release again 
    wakeLock.release(); 
} 

private boolean isKioskModeActive(final Context context) { 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); 
    return sp.getBoolean(PREF_KIOSK_MODE, false); 
} 

public interface Listener { 
    public void onPower(); 
} 

public void setListener(Listener listener) { 
    this.listener = listener; 
} 
} 

清單中添加:

<application 
    android:name=".MyApp"> 

</application> 

另一種方式:

public class MyApp extends Application { 

public static boolean isActivityVisible() { 
    return activityVisible; 
} 

public static void activityResumed() { 
    activityVisible = true; 
} 

public static void activityPaused() { 
    activityVisible = false; 
} 

private static boolean activityVisible = false; 

@Override 
public void onCreate() { 
    super.onCreate(); 
} 
} 

主類中重寫梅託德:

@Override 
protected void onResume() { 
    super.onResume(); 
    MyApp.activityResumed(); 
} 

@Override 
protected void onPause() { 
    MyApp.activityPaused(); 
    super.onPause(); 

} 

的onClick按下按鈕:

if(MyApp.isActivityVisible()){ 

    } 
+0

Благодарюзаидею! Покопаюсьвэтомнаправлении.. – Alexander

+0

@Alexanderнезачто –