1

我正在尝试创建一个可以在按下电源按钮时做出响应的应用程序。更具体地说,它会在按下 2 或 3 次时响应。

现在,我尝试了以下方法:

public class SMSKey extends BroadcastReceiver{

    static int countPowerOff = 0;
    private Activity activity = null;
    public SMSKey(Activity activity){
        this.activity = activity;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
            countPowerOff++;
        }else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
            if(countPowerOff == 2){
                Intent i = new Intent(activity, SMSOptions.class);
                activity.startActivity(i);
            }
        }
    }

}

在我的清单中:

<receiver android:name=".SMSKey">
        <intent-filter >
            <action android:name="android.intent.action.SCREEN_OFF"/>
            <action android:name="android.intent.action.SCREEN_ON"/>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
            <action android:name="android.intent.action.ACTION_SHUTDOWN"/>
        </intent-filter>
    </receiver>

最后在我的MainActivty.java中:

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
SMSKey mReceiver = new SMSKey(this);
registerReceiver(mReceiver, filter);

即使这有效,它也只适用于第一次,当按下电源按钮时,它不会在第二次或第三次尝试时起作用。为什么呢 ??

还有一个问题:如您所见,我在 MainActivity 中使用了这个 KeyPress 事件,这意味着应用程序将一直打开。有没有其他方法可以在不进入 MainActivity 的情况下实现这一点。

4

2 回答 2

3

这甚至不是安卓问题。countPowerOff收到 3 次按键后,您永远不会重置变量。即使在这样做之后,您也必须考虑添加一个警报,该警报将countPowerOff在一些小的超时后将您的变量重置为零。它将允许您避免用户不打算与您的应用程序交互而只是按下按钮但仍然被计算在内的情况。

至于您的第二个问题,请尝试实施IntentService

于 2013-09-15T21:40:22.253 回答
0

这是解决方案

public class MyReceiver extends BroadcastReceiver {
private static int countPowerOff = 0;

public MyReceiver (){

}

@Override
public void onReceive(Context context, Intent intent){
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){    
    Log.e("In on receive", "In Method:  ACTION_SCREEN_OFF");
    countPowerOff++;
}
else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
    Log.e("In on receive", "In Method:  ACTION_SCREEN_ON");
}
else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)){
    Log.e("In on receive", "In Method:  ACTION_USER_PRESENT");
    if (countPowerOff >= 2)
    {
        countPowerOff=0;
        Toast.makeText(context, "MAIN ACTIVITY IS BEING CALLED ", Toast.LENGTH_LONG).show();
        Intent i = new Intent(context, About.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(i);
    }
}
  }
 }
于 2014-05-06T09:42:26.647 回答