android - 手机重启后如何记住未决的 Intent 和警报?

标签 android broadcastreceiver android-pendingintent android-alarms android-broadcast

我真的是 android 的新手,我一直在制作一个应用程序,根据我的大学时间表将手机变成振动模式。我希望我的应用程序在手机重新启动后记住未决的 Intent ,这样就不必在每次重新启动设备时都输入他们的时间表。

这是我的代码:

import java.util.ArrayList;
import java.util.Calendar;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent; 
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;


public class Labs extends Activity implements OnClickListener {

private ArrayList <Calendar> Cal= new ArrayList <Calendar>(60);

private ArrayList <CheckBox> l= new ArrayList <CheckBox>(60);

private ArrayList <Boolean> checkboxValue_lab = new ArrayList <Boolean>(60);

private SharedPreferences mSharedPreferences_l;
private SharedPreferences.Editor mPrefsEditor_l;
private Button submitButton;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_labs);
    addenable();


    submitButton = (Button)findViewById(R.id.button1);
    submitButton.setOnClickListener(this);

    mSharedPreferences_l = getSharedPreferences("loginPrefs", MODE_PRIVATE);
    mPrefsEditor_l = mSharedPreferences_l.edit();




    //Initialise check boxes for every slot
    for (int i = 101; i <= 160; i++) {
           String viewId = "checkBox" + i;
           l.add(i-101, (CheckBox) findViewById(getResources().getIdentifier(viewId, "id", getPackageName())));
           checkboxValue_lab.add(i-101, mSharedPreferences_l.getBoolean("lab"+(i-101), false));

           if (checkboxValue_lab.get(i-101) == true) {
               l.get(i-101).setChecked(true);}
           }
        }   



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}   

public void addenable(){

}

public int Day(int a)
{
    int d=0;
    int x = a;
    x--;

    if(x>=30)
        d = (x/6)-3;

    else
        d=(x/6)+2;

    return d;
}

public int Hour(int a)
{
    int hr=0;
    int x=a;

    x--;

    hr=(x%6)+8;

    if((x%6)>=4)
        hr--;

    if(x>=30)
        hr = hr+6;

    return hr;

}

public int Min(int a)
{
    int m=0;
    int x=a;

    if(x%6==5)
        m=50;

    if(x%6==0)
        m=40;

    return m;
}

public void getdata(View V){

    for( int i=0; i<60; i++)
    {
        Cal.add(i, Calendar.getInstance());
        Cal.get(i).set(Calendar.DAY_OF_WEEK, Day(i+1));
        Cal.get(i).set(Calendar.HOUR_OF_DAY, Hour(i+1));
        Cal.get(i).set(Calendar.MINUTE, Min(i+1));
        Cal.get(i).set(Calendar.SECOND, 0);
    }


    //Intents
    Intent setVibration = new Intent();
    setVibration.setClass(this, AlarmReciever.class);



    //PENDING INTENTS
    ArrayList <PendingIntent> Lab_V= new ArrayList <PendingIntent>(60);


    for(int i=0; i<60; i++)
    {
        Lab_V.add(PendingIntent.getBroadcast(this, i, setVibration,
                PendingIntent.FLAG_UPDATE_CURRENT));

    }

    // create the object
    AlarmManager mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    for(int i=0; i<60; i++)
    {
            if(l.get(i).isChecked()){

             mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Cal.get(i).getTimeInMillis(), 7*24*60*60*1000, Lab_V.get(i));


            }
    }

    }


public void onClick(View view) {

    for(int i = 0; i < 60 ; i++){

        if(l.get(i).isChecked()){
            mPrefsEditor_l.putBoolean("lab"+i, true);
            mPrefsEditor_l.commit();
        }
        else {
            mPrefsEditor_l.putBoolean("lab"+i, false);
            mPrefsEditor_l.commit();
        }
    }

    getdata(view);

}
}

AlarmReciever.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.widget.Toast;

public class AlarmReciever extends BroadcastReceiver
{
private AudioManager mAudioManager;

@Override
        public void onReceive(Context context, Intent intent)
        {
                // TODO Auto-generated method stub

        mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
        mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);

        // Show the toast
        Toast.makeText(context, "Vibration Mode", Toast.LENGTH_SHORT).show();

          }
}

Android list :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ish.k.silentmode"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="19" />

  <!-- permission required to use Alarm Manager -->
        <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>




<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >



    <activity
        android:name="ish.k.silentmode.MainActivity"
        android:label="@string/app_name" 
       >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name="ish.k.silentmode.GetSlots"
        android:label="Select your slots"
        android:screenOrientation="portrait" >


    </activity>

     <activity
        android:name="ish.k.silentmode.MorningSlots"
        android:label="Select your morning slots"
        android:screenOrientation="portrait" >


    </activity>

      <activity
        android:name="ish.k.silentmode.EveningSlots"
        android:label="Select your evening slots"
        android:screenOrientation="portrait" >


    </activity>

       <activity
        android:name="ish.k.silentmode.Labs"
        android:label="Select your lab slots"
        android:screenOrientation="portrait" >


    </activity>

       <activity
        android:name="ish.k.silentmode.About"
        android:label="About"
        android:screenOrientation="portrait" >


    </activity>

     <activity
        android:name="ish.k.silentmode.AlarmReciever"
        android:label="AlarmReciever" >


    </activity>

       <!-- Register the Alarm Receiver -->
               <receiver android:name=".AlarmReciever"/>

      <activity
        android:name="ish.k.silentmode.RingerMode"
        android:label="RingerMode" >


    </activity>

       <!-- Register the Alarm Receiver -->
               <receiver android:name=".RingerMode"/>
</application>

</manifest>

请帮忙。

提前致谢。

最佳答案

系统重启后需要重新设置,可以使用boot receiver。

在谷歌开发者上有描述here .

基本上就是这样,在您的 AndroidManifest 上定义接收器:

<receiver
    android:name=".BootReceiver"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
    android:enabled="true" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

并将 BootReceiver 实现为普通的广播接收器。

关于android - 手机重启后如何记住未决的 Intent 和警报?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24962062/

相关文章:

android - 显示带或不带年份字段的 DatePicker

java - 如何使用此 Activity 解决 : java. lang.IllegalStateException : You need to use a Theme. AppCompat 主题(或后代)?

android - Intent 仅缺少 IntentService 中的一些额外功能

android - 将数据从小部件传递到应用程序

android - 在 AlarmManager 中获取 Activity 的 PendingIntents 列表

android - layout-land 中定义的 xml 布局不会出现在 android 应用程序中

android - 使用 SimpleCursorAdapter OnItemClickListener 的 ListView 不起作用

android - 用 canvas 画画 Android

android - 使用 AlarmManager 从 BroadcastReceiver 启动服务

android - 我应该如何使用 alarmmanager 每天和中午 12 点运行服务