android - BroadCast Receiver 正在计算电源按钮的点击次数,但无法恢复最小化的 Activity

标签 android android-intent android-activity android-broadcast

在这段代码中:

1.public class MyReceiver extends BroadcastReceiver 2. public class MainActivity extends Activity

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

附言我想在某些点击后启动一个 Activity 。

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>

最佳答案

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 中注册接收器,则无需在 list 中注册接收器。

此外,最好从 ACTION_USER_PRESENT 开始您的 Activity ,因为这意味着设备在按下电源按钮锁定后已解锁。但是,如果您想从 ACTION_SCREEN_ON 启动 Activity,您也可以这样做,这也可以,但只有在用户解锁设备后 Activity 才会可见。 此代码有效。

关于android - BroadCast Receiver 正在计算电源按钮的点击次数,但无法恢复最小化的 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19761900/

相关文章:

android - 使用 Android 的 TextView 的 FindViewById 上的 NulPointer 异常

android - 从 Alertdialog 启动另一个 Activity

java - 想要将 Activity 更改为 Fragment

android - 如何在android中制作应用程序锁定应用程序?

机器人 ObjectAnimator.ofFloat 无法正常工作

java - 从 MySql 表中获取的 Android 应用程序数据

android - 新 Activity 的 onStart 在父 Activity 的 onStop 之前被调用

android - 使用 recreate() 方法和 startActivity(getIntent()) 重新创建 Activity 的区别

javascript - 这是什么奇怪的: JSON Parse error: Unexpected identifier "Tunnel"

android - AmbiguousViewMatcherException Espresso