1

在这段代码中:

1.公共类MyReceiver扩展BroadcastReceiver 2.公共类MainActivity扩展Activity

当我的应用程序启动时,我按下 HOME 按钮并最小化它!之后,MyRecevier 正在计算 LOGCAT 中可见的电源按钮计数,但随后 MyReceiver 无法启动(在屏幕上显示)最小化活动,即 MAINACTIVITY 或任何其他新活动。

PS我想在某些点击后启动一项活动。

MyReceiver.java

public class MyReceiver extends BroadcastReceiver{
final static String TAG = "customTAG";

 static int countPowerOff=0;
    private Activity activity=null;
    public MyReceiver (Activity activity)
    {
    this.activity=activity;
    }
    @Override
    public void onReceive(Context context, Intent intent) {

      Log.d(TAG, "Power button is pressed.");
      Log.d(TAG, "Power button count is " +countPowerOff);
      Toast.makeText(context, "power button clicked", Toast.LENGTH_SHORT).show();

if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) 
{
    countPowerOff++;    
    Log.d(TAG, "Action OFF!! Power count increased .");
    Log.d(TAG, "Power button count is " +countPowerOff);

} 
else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) 
{
    Log.d(TAG, "ACTION SCREEN ON");
    Log.d(TAG, "Power button count is " +countPowerOff);

      if(countPowerOff>2)
      {
          Log.d(TAG, "Power button count is " +countPowerOff);
          Log.d(TAG, "Count is greater than 2 now it should start ");
          countPowerOff=0;
          Toast.makeText(context, "MAIN ACTIVITY IS BEING CALLED ", Toast.LENGTH_LONG).show();

          Intent i = new Intent(activity,MainActivity.class);
              //I have tired different flags!!
              //below lines are not making any effect unable to popup MainActivity
          i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
          activity.startActivity(i);
          context.startService(i);         

       }
    }
}}

MainActivity.java

public class MainActivity extends Activity {
static int a = 0;
MyReceiver mReceiver;
final static String TAG = "customTAG";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);        
    mReceiver = new MyReceiver (this);
    registerReceiver(mReceiver, filter);
    a++;
    Log.d(TAG, "onCreate Event count : " +a);      
}

public void onNewIntent()
{
    Log.d(TAG, "onNewIntent started !!");
}

public void onStart()
{
    super.onStart();
    Log.d(TAG, "onStart event Occured  !!");
}

public void onResume()
{
    super.onResume();
    Log.d(TAG, "onResume event occured !!");
}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}}  

AndroidManifest.xml

<application>
 ..
 ..
 ..
 ..
<receiver android:name="MyReceiver"> 
           <intent-filter>
            <action android:name="android.intent.action.ACTION_SCREEN_ON"></action>
            <action android:name="android.intent.action.ACTION_SCREEN_OFF"></action>                
        </intent-filter>
         </receiver>
</application>
4

1 回答 1

4

MyReceiver.java

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, MainActivity.class);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);
                context.startActivity(i);
            }
        }
    }
}

MainActivity.java

public class MainActivity extends Activity 
{
    private MyReceiver myReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_USER_PRESENT);
        myReceiver = new MyReceiver();
        registerReceiver(myReceiver, filter);
    }

    @Override
    protected void onDestroy() 
    {
        if (myReceiver != null)
        {
            unregisterReceiver(myReceiver);
            myReceiver = null;
        }           
        super.onDestroy();
    }
}

如果您已经在 Activity 中注册,则无需在清单中注册接收器。

此外,最好从 开始您的活动ACTION_USER_PRESENT,因为这意味着设备在按下电源按钮后已解锁。但是,如果您想从 开始 Activity ACTION_SCREEN_ON,您也可以这样做,这也可以,但只有在用户解锁设备后才能看到该 Activity。此代码正在运行。

于 2013-11-06T05:05:26.457 回答