首页 > 解决方案 > 当我重新启动手机时,我的闹钟应用程序无法正常工作

问题描述

我试图在 android 中创建自己的闹钟。目的是我的闹钟应该根据我的播放列表播放不同的歌曲。这是一个大学项目。用户设置了一个闹钟然后忘记了,然后即使在多次重新启动后,闹钟也应该播放。我从中下载了一个示例代码,并正在研究这个。但是,在重新启动电话时,我的警报丢失了。我发现我需要使用广播接收器,但它仍然无法在我的手机熔岩手机上工作。您能否建议此代码是否正常。这是我的代码链接:https ://drive.google.com/file/d/1ADVyH0grEQ4g80HkFU1n2Cb4wxnQC4TX/view?usp=sharing

我的android清单文件是..

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.alarmmanager">
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

我的布局文件...

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="28dp"
        android:ems="10"
        android:hint="Number of seconds"
        android:inputType="numberDecimal" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/time"
        android:layout_below="@+id/time"
        android:layout_marginRight="60dp"
        android:layout_marginTop="120dp"
        android:text="Start" />

</RelativeLayout>

我的接收器代码..

    package com.alarmmanager;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.util.Log;
import android.widget.Toast;

import java.util.Calendar;

/**
 * Created by bhaskar on 24-04-2018.
 *
 */

public class MyBroadcastReceiver extends BroadcastReceiver {
    MediaPlayer mp;
    @Override
    public void onReceive(Context context, Intent intent) {
        mp= MediaPlayer.create(context, R.raw.alrm   );
        mp.start();
        Toast.makeText(context, "Alarm....", Toast.LENGTH_LONG).show();
        Log.i("Alarm","Alarm"+ Calendar.getInstance().getTime());
    }
}

主活动文件

public class MainActivity extends AppCompatActivity {
Button b1;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    b1=(Button) findViewById(R.id.button1);

    b1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            startAlert();
        }
    });
}
public void startAlert() {
    EditText text = (EditText) findViewById(R.id.time);
    int i = Integer.parseInt(text.getText().toString());
    Intent intent = new Intent(this, MyBroadcastReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            this.getApplicationContext(), 234324243, intent, 0);
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
            + (i * 1000), pendingIntent);
    Toast.makeText(this, "Alarm set in " + i + " seconds", Toast.LENGTH_LONG).show();
}

}

标签: androidservicealarmmanagerandroid-broadcastreceiver

解决方案


请参阅此官方文档以在手机重新启动时保持警报。在设备启动时启动警报部分

获得实际代码后,我正在编辑此答案:

1)创建新的接收器而不是使用旧的接收器

public class SampleBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
            // Set the alarm here.
            Log.d("AlarmDone", "AlarmDone");
        }
    }
}

2)在清单文件中注册它:

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

3)在清单中更改您的旧接收器代码:

<receiver android:name=".AlarmReceiver" />

注意:在清单中添加权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

现在你的闹钟会响起。


推荐阅读