Android中的Elapsed Time之后我该怎么办?

时间:2014-07-24 10:20:50

标签: android sdk elapsedtime

我是编程新手。

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

我用Google搜索并发现,需要Elapsed Real Timer。我也找到了这段代码并实现了它(这是我班上唯一的代码)当用户从微调器下拉列表中选择一些东西时调用该类:

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);    
    }
}

2 个答案:

答案 0 :(得分:0)


以下内容对您有用
创建一个转向wifi&amp; amp;其他业务
在其中创建一个广播接收器onReceive方法调用该服务
当警报时间段播放然后触发广播接收器时,创建一个待处理的意图和警报一段时间。

答案 1 :(得分:0)

  1. 制作BroadcatReceiver展开WakefulBroadcastReceiver
  2. 提供延长IntentService课程的服务。
  3. onHandleIntent()内的服务中,编写代码以关闭或打开wifi。
  4. 现在返回你的BroadcastReceiver类,在onReceive()里面调用你在第2步中创建的服务。
  5. 您的代码行

    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()。

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

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