【问题标题】:How can I do something after Elapsed Time in Android?在 Android 中经过时间后我该如何做某事?
【发布时间】:2014-07-24 10:20:50
【问题描述】:

我是编程新手。

我想在后台 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);    
    }
}

【问题讨论】:

    标签: android sdk elapsedtime


    【解决方案1】:
    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.getService 替换为 PendingIntent.getBroadcast 并传递您在步骤 1 中创建的 BroadcastReceiver 类的引用

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

    更新: 在您的BroadcastReceiver's onReceive() 中像这样调用服务

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

    这将调用 onHandleIntent()。

    更新 2getBaseContext() 替换为 this 并将 PendingIntent.getService 更改为

    Intent i=new Intent(this, BroadCastReceiver.class);
            PendingIntent alarmIntent=PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
    

    【讨论】:

    • 第一:非常感谢您的回答!我试过这个,但什么也没发生。我要发布代码吗?
    • manifest 文件中我也写了代码。还有打开/关闭wifi的权限
    • 我根据您的步骤更新了我的代码。请检查一下。谢谢
    • 他停止了应用程序并在此行上给了我NullPointerExceptionstartActivity(new Intent(SpinnerTimeOnItemSelectedListener.this, ElapsedRealtimeAlarm.class)); 这行错了吗?我应该只用new ElapsedRealTimeAlarm() 打电话给ElapsedRealTimeAlarm吗?
    • 你能分享ElapsedRealTimeAlarm's onCreate()和你正在执行的方法startActivity(new Intent(SpinnerTimeOnItemSelectedListener.this, ElapsedRealtimeAlarm.class));
    【解决方案2】:


    请执行以下对您有用的操作
    创建一个服务来开启 wifi 和其他操作
    在 onReceive 方法调用服务中创建一个广播接收器
    为您想要的时间创建一个待处理的意图和警报,当警报时间段过去时触发广播接收器。

    【讨论】:

    • 好的。只是为了确保:我写了关闭wifi的方法。然后我将编写一个广播接收器,在其中我调用关闭 wifi 的方法。然后在时间过去后我在我的 ElapsedRealTimeAlarm 类中调用广播接收器?这是你提到的吗?我创建的 PendingIntent 还好吗?但这仍然不能回答我的问题。我怎么知道经过实时报警的时间已经结束?
    • 我试过了,但这不起作用。他停止了应用程序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    相关资源
    最近更新 更多