0

我是编程新手。

我想在后台 2 小时后关闭 wifi(我知道如何关闭它)

我用谷歌搜索发现,需要经过实时计时器。我也找到了这段代码并实现了它(这是我班级中唯一的代码)当用户从微调器下拉列表中选择某些内容时调用这个类:

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.Toast;

/**
 * Wird aufgerufen, wenn eine Zeit von der dropdown liste gewählt wurde
 */
public class ElapsedRealtimeAlarm extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        PendingIntent mAlarmSender = PendingIntent.getService(ElapsedRealtimeAlarm.this,
                0, new Intent(ElapsedRealtimeAlarm.this, ElapsedRealtimeAlarm.class), 0);
        long  firstTime = SystemClock.elapsedRealtime(); // elapsedRealTime --> Zeit seitdem booten.
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        am.setRepeating(AlarmManager.ELAPSED_REALTIME,      // die 2h (1*1000*3600*2) werden von der Bootzeit(firstTime) dazugerechnet
                firstTime, 1*1000*3600*2, mAlarmSender);                     //  1*1000 --> 1s * 3600 --> 1h * 2 --> 2h
        Toast.makeText(getApplicationContext(), "Das ist ein Text", Toast.LENGTH_SHORT).show();
    }
}

代码到现在还好吗?以及如何在经过计时器后关闭 wifi?这是经过的计时器只有一次还是像一个间隔?

对不起我的英语不好

谢谢

编辑

我做了“Deb”的答案中提到的步骤,但仍然没有发生这里的代码第 1 步:“进行BroadcatReceiver扩展WakefulBroadcastReceiver

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.WakefulBroadcastReceiver;
import android.widget.Toast;


public class BroadCastReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "I'm running", Toast.LENGTH_SHORT).show();
        new BackgroundService(); // Step 4
    }
}

第 2 步:创建一个扩展IntentService类的服务 第 3 步:在您的服务里面onHandleIntent()编写您的代码来关闭或打开 wifi。

import android.app.IntentService;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.view.View;
import android.widget.Toast;

public class BackgroundService extends IntentService {

    public BackgroundService() {
        super("BackgroundService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
        if (wifiManager.isWifiEnabled()) {
            wifiManager.setWifiEnabled(false);
        } else {
            wifiManager.setWifiEnabled(true);
        }
    }

第 4 步:现在回到您的BroadcastReceiver班级,在里面onReceive()调用您在第 2 步中创建的服务(代码已经在第 1 步中)

清单文件(wifi 的接收者、服务和权限)

<manifest ..... ..... ....>
<application>
.....
<receiver android:name=".BroadCastReceiver" ></receiver>
        <service android:name=".BackgroundService" android:exported="false"></service>
    </application>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
</manifest>

编辑 2

我正在执行的课程startActivity(new Intent(SpinnerTimeOnItemSelectedListener.this, ElapsedRealtimeAlarm.class));

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.SystemClock;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Toast;

public class SpinnerTimeOnItemSelectedListener extends Activity implements AdapterView.OnItemSelectedListener {

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        if(parent.getItemAtPosition(position).toString().equals("Zeit auswählen") || parent.getItemAtPosition(position).toString().equals("Select Time")){
            //onNothingSelected(parent);
            ;
        } else if (parent.getItemAtPosition(position).toString().equals("30min")){
            startActivity(new Intent(SpinnerTimeOnItemSelectedListener.this, ElapsedRealtimeAlarm.class));
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        // Wenn es einen ElapsedRealTimeAlarm gibt, soll er gecancelt werden
        // Ansonsten nichts
        ;
    }
}

ElapsedRealtimeAlarm's onCreate()

   public class ElapsedRealtimeAlarm extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        Toast.makeText(getBaseContext(), "ElapsedRealTimeAlarm wurde aufgerufen", Toast.LENGTH_SHORT).show(); // just to check, that he called this class
        PendingIntent mAlarmSender = PendingIntent.getService(ElapsedRealtimeAlarm.this,
                0, new Intent(ElapsedRealtimeAlarm.this, BroadCastReceiver.class), 0);
        long  firstTime = SystemClock.elapsedRealtime(); // elapsedRealTime --> Zeit seitdem booten.
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        am.setRepeating(AlarmManager.ELAPSED_REALTIME,      // die 2h (1*1000*3600*2) werden von der Bootzeit(firstTime) dazugerechnet
                firstTime+2000, 10, mAlarmSender);    
    }
}
4

2 回答 2

0


执行以下操作将对您有用
创建一个服务来打开wifi和其他操作
在该onReceive方法中创建一个广播接收器调用该服务
创建一个挂起的意图和警报您想要的时间,当警报时间段过去然后触发广播接收者。

于 2014-07-24T10:49:41.020 回答
0
  1. 做一个BroadcatReceiver扩展WakefulBroadcastReceiver
  2. 做一个服务扩展IntentService类。
  3. 在你的服务里面onHandleIntent()写你的代码来关闭或打开wifi。
  4. 现在回到您的 BroadcastReceiver 类,在 onReceive() 内部调用您在步骤 2 中创建的服务。

你的代码行

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    am.setRepeating(AlarmManager.ELAPSED_REALTIME,      // die 2h (1*1000*3600*2) werden von der Bootzeit(firstTime) dazugerechnet
            firstTime, 1*1000*3600*2, mAlarmSender);

这负责每 2 小时后重复运行警报管理器。但是如果您希望警报管理器仅运行一次,请替换am.setRepeating()am.set().

你的代码

PendingIntent mAlarmSender = PendingIntent.getService(ElapsedRealtimeAlarm.this,
            0, new Intent(ElapsedRealtimeAlarm.this, ElapsedRealtimeAlarm.class), 0);

替换PendingIntent.getServicePendingIntent.getBroadcast并传递您在步骤 1 中创建的 BroadcastReceiver 类的引用

注意:不要忘记在你的清单中写下接收者和服务,否则它将不起作用

更新:在您的BroadcastReceiver's onReceive()通话中,像这样的服务

Intent service=new Intent(context,BackgroundService.class);
    startWakefulService(context, service);

这将调用 onHandleIntent()。

更新 2替换getBaseContext()thisPendingIntent.getService 并将其更改为

Intent i=new Intent(this, BroadCastReceiver.class);
        PendingIntent alarmIntent=PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
于 2014-07-24T13:24:40.150 回答