【问题标题】:Close application from broadcast receiver从广播接收器关闭应用程序
【发布时间】:2014-10-01 05:17:18
【问题描述】:

我是安卓编程新手。 我尝试在活动中注册广播接收器,但当应用程序处于暂停状态时,我的接收器无法正常工作。 所以我发现我需要在清单中注册我的接收器。

我的目标是在用户关闭 Wifi 后关闭我的应用程序一段时间。

这是我的代码,但它不起作用。

public class ReceiverWifi extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Handler handler = new Handler();
        Runnable runnable = new Runnable() {

            @Override
            public void run() {
                MainActivity m = new MainActivity();
                m.finish();

            }
        };

        if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {

            int newWifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
                    WifiManager.WIFI_STATE_UNKNOWN);

            switch (newWifiState) {

            case WifiManager.WIFI_STATE_DISABLED:

                Toast.makeText(context, "Wi-fi Disconnected ",
                        Toast.LENGTH_SHORT).show();

                handler.postDelayed(runnable, 15 * 1000);
                break;

            }
        }

    }
}

我的清单:

<receiver android:name="com.example.wifimonitor.ReceiverWifi" >
    <intent-filter>
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
    </intent-filter>
</receiver>

我如何实现我的目标?

【问题讨论】:

  • 你有没有在 onPause() 上写过任何代码。如果有,请贴出来
  • onPause() 上没有代码

标签: android broadcastreceiver


【解决方案1】:

使用以下代码从 BroadcastReceiver 向 MainActivity 发送新意图:

Intent i = new Intent(context, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags (Intent.FLAG_ACTIVITY_SINGLE_TOP);
i.putExtra("close_activity",true);
context.startActivity(i);

在 MainActivity 中使用 OnNewIntent 如下:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if(intent.getBooleanExtra("close_activity",false)){
        this.finish();

    }
}

仅供参考,我没有尝试过上面的代码,但我有类似的代码在工作。

【讨论】:

    【解决方案2】:

    您的广播接收器在主要活动类中?如果是这样,您可以保存应用的全局上下文并稍后在广播接收器中将其关闭。

    如果它在服务或提供商上,只需在启动/注册时向它发送一个应用实例。然后你从那个实例调用finish()。

    编辑:

    试试这个:

    在你的主要活动中创建这个公共方法:

       public static void closeActivity(){
            finish();
       }
    

    然后在你的广播接收器中调用这个方法:

       MainActivity.closeActivity();
    

    希望对你有所帮助;)

    【讨论】:

    • 我的 ReceiverWifi 作为一个新类,我如何向它发送一个实例?
    • 我收到此错误:无法从 Activity 类型对非静态方法完成()进行静态引用
    • finish() 更改为MainActivity.finish()... 或在onCreat 中创建private static Context context;,然后在context = this; 中创建closeActivity(),然后在context.finish(); 中创建context.finish();跨度>
    • @margabro 它对我不起作用.. :( 给出相同的错误。我在 cmets 中尝试了您的解决方案,然后它说无法解决方法 finish(); 如果我定义完成它给出可以'从静态引用非静态,如果我将完成声明为静态,它会给出静态方法完成不能覆盖实例方法.. :( :(
    • 这显然不起作用,finish 是一个非静态方法,因为它对一个实例执行操作,如果没有实例你不能调用finish()。谁有更好的解决方案?
    【解决方案3】:
    MainActivity m = new MainActivity();
    m.finish();
    

    当您说完成时,它不会从堆栈中清除,因为您没有先将活动加载到堆栈中。 MainActivity 在这里不是活动,它只是你代码中的一个类对象

    在 mainactivity 中有广播接收器,当 onreceive 完成活动时。不要用 new 创建实例。

    【讨论】:

    • 我需要另一个班级的广播接收器,怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 2018-03-13
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多