【问题标题】:How to do things in the background in android如何在android的后台做事
【发布时间】:2015-05-12 23:12:51
【问题描述】:

我的应用有一个活动、一个管理员接收器和一个警报管理器接收器。即使应用程序关闭,我也希望能够执行以下操作:

1- 禁用警报并在设备管理员禁用时将布尔首选项设为 false 2- 收到警报后执行一些管理任务。

我尝试将代码放入接收器,但代码仅在应用程序运行时才有效。然后我尝试在 onCreate() 之前初始化所有与警报管理器和设备管理员相关的代码,但我无法引用接收器中的代码,因为其中一些是动态的。

那么我该如何实现呢?

代码

public class mainActivity extends ActionBarActivity {

static EditText numberOfHours;
static TextView hourText;
static Button setButton;
static Context context;

static DevicePolicyManager dpm;
static ComponentName admin;
static boolean adminCheck;
static Intent intent;

static SharedPreferences preferences;
static SharedPreferences.Editor editor;
static boolean appSet;

static AlarmManager alarmManager;
static PendingIntent alarmIntent;
static Intent mIntent;
static Calendar calendar;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    hourText = (TextView) findViewById(R.id.hourText);
    numberOfHours = (EditText) findViewById(R.id.numberOfHours);
    setButton = (Button) findViewById(R.id.setButton);
    context = this;

    dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
    admin = new ComponentName(context, adminReceiver.class);
    intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, admin);
    intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "The app needs to be a device administrator to be able to lock the screen");

    preferences = getPreferences(Context.MODE_PRIVATE);
    editor = preferences.edit();
    editor.putBoolean("appSet", false);
    appSet = preferences.getBoolean("appSet", false);

    alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    mIntent = new Intent(context, alarmReceiver.class);
    alarmIntent = PendingIntent.getBroadcast(context, 24, mIntent, 0);
    calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 24);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);

    setButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
                    if (adminCheck) {
                        numberOfHours.setEnabled(false);
                        setButton.setEnabled(false);
                        setButton.setText("Done");
                        editor.putBoolean("appSet", true).commit();

                        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),1000 * 60 * 60 * 24, alarmIntent);
                    }
                    else {

                        startActivityForResult(intent, 1);

                    }
            }
        });
    }

static public class adminReceiver extends DeviceAdminReceiver {
    @Override
    public void onEnabled(Context context, Intent intent) {
        super.onEnabled(context, intent);
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        super.onDisabled(context, intent);
    }

    @Override
    public void onPasswordChanged(Context context, Intent intent) {
        super.onPasswordChanged(context, intent);
    }
}

static public class alarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context, "Alarm", Toast.LENGTH_SHORT).show();
    }
}

}

【问题讨论】:

    标签: android broadcastreceiver


    【解决方案1】:

    如果您希望您的代码在您的应用关闭时运行,您可能需要查看Services

    【讨论】:

    • 我希望它在其中一位接收者得到我的意图时运行。是的,也许这可以通过服务或意图服务来完成,但我不知道如何。
    • 我把它放在问题中。
    • 您是否在清单中指定了接收方?您是否收到任何 Logcat 错误,或者只是“不工作”?
    • 这两个接收器正在工作,但是当我在 adminReceiver 中将 alarmMananger.cancel(alarmIntent) 之类的内容添加到 onDisabled 时,它仅在活动正常工作时才有效(调用 onCreate)。关闭应用程序并从设置中禁用设备管理器后,我认为 alarmIntent 为 null 并导致应用程序崩溃。
    • 如果将警报意图实例从onCreate 移动到onReceive 会怎样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    相关资源
    最近更新 更多