从广播接收器关闭应用程序

5
我是一名新手安卓程序员。 我尝试在活动中注册广播接收器,但当应用程序暂停时我的接收器无法正常工作。 所以我发现我需要在清单文件中注册我的接收器。
我的目标是在用户关闭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() 的代码吗?如果有,请发布出来。 - Ruban
不要在onPause()中放置任何代码。 - vintry
3个回答

3
使用以下代码从BroadcastReceiver发送新意图到MainActivity:
``` Intent intent = new Intent(context, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); ```
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();

    }
}

我还没有尝试过以上代码,但是我有类似的代码可以正常工作。


-1
MainActivity m = new MainActivity();
m.finish();

当你说完成时,它不会从堆栈中清除,因为你没有先将活动加载到堆栈中。

MainActivity 在这里不是活动,它只是你代码中的类对象。

在 MainActivity 中有广播接收器,当 onReceive 完成活动时,请勿使用 new 创建实例。


我需要在另一个类中使用我的广播接收器,该怎么做? - vintry

-1

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

如果它在服务或提供程序上,只需在启动/注册时向其发送应用程序的实例。然后从该实例调用finish()。

编辑:

尝试这个:

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

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

然后在您的广播接收器中调用此方法:

   MainActivity.closeActivity();

希望能有所帮助 ;)

我有一个名为ReceiverWifi的新类,如何向它发送一个实例? - vintry
1
我得到了这个错误:无法从Activity类型中进行静态引用非静态方法finish()。 - vintry
2
finish() 更改为 MainActivity.finish()... 或在 onCreate 中创建一个 private static Context context;,然后执行 context = this;,最后在 closeActivity() 方法中执行 context.finish(); - kodartcha
1
@margabro,对我不起作用... :( 出现相同的错误。我尝试了你在评论中提供的解决方案,然后它说无法解析方法 finish(); 如果我定义 finish,则会发出“不能从静态引用非静态”的消息,如果我将finish声明为静态,则会显示静态方法finish无法覆盖实例方法.. :( :( - Prabs
显然不起作用,finish是一个非静态方法,它对一个实例执行操作,如果没有实例,就无法调用finish()。有人有更好的解决方案吗? - Tiago_nes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接