2016-10-11 120 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незачто –