Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在MyAlarm类的onReceive中,即使我在发送Intent时坐在putExtra中,Intent也会变为null_Android_Android Intent_Broadcastreceiver - Fatal编程技术网

Android 在MyAlarm类的onReceive中,即使我在发送Intent时坐在putExtra中,Intent也会变为null

Android 在MyAlarm类的onReceive中,即使我在发送Intent时坐在putExtra中,Intent也会变为null,android,android-intent,broadcastreceiver,Android,Android Intent,Broadcastreceiver,主要活动: package com.jimmytrivedi.alarmdemo; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.util.Log; i

主要活动:

package com.jimmytrivedi.alarmdemo;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TimePicker;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import java.util.Calendar;

import butterknife.BindView;
import butterknife.ButterKnife;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private static final String TAG = MainActivity.class.getSimpleName();

    @BindView(R.id.timePicker)
    TimePicker timePicker;
    @BindView(R.id.buttonAlarm)
    Button buttonAlarm;
    @BindView(R.id.cancelAlarm)
    Button cancelAlarm;

    private AlarmManager alarmManager;
    private PendingIntent pendingIntent;
    private Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        cancelAlarm.setEnabled(false);
        selClickListener();
    }

    private void selClickListener() {
        buttonAlarm.setOnClickListener(this);
        cancelAlarm.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case R.id.buttonAlarm:
                Calendar calendar = Calendar.getInstance();
                if (Build.VERSION.SDK_INT >= 23) {
                    calendar.set(
                            calendar.get(Calendar.YEAR),
                            calendar.get(Calendar.MONTH),
                            calendar.get(Calendar.DAY_OF_MONTH),
                            timePicker.getHour(), timePicker.getMinute(), 0);
                } else {
                    calendar.set(
                            calendar.get(Calendar.YEAR),
                            calendar.get(Calendar.MONTH),
                            calendar.get(Calendar.DAY_OF_MONTH),
                            timePicker.getCurrentHour(), timePicker.getCurrentMinute(), 0);
                }
                setAlarm(calendar.getTimeInMillis());
                showLog("getTimeInMillis: "+calendar.getTimeInMillis() );
                cancelAlarm.setEnabled(true);

                break;

            case R.id.cancelAlarm:
                cancelAlarm();
                break;
        }
    }

    private void setAlarm(long time) {
        //creating a new intent specifying the broadcast receiver
         Intent intent = new Intent(this, MyAlarm.class);
         intent.putExtra("REMINDER_ID", "1");

        //creating a pending intent using the intent
         pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

        //setting the repeating alarm that will be fired every day
        alarmManager.setRepeating(AlarmManager.RTC, time, AlarmManager.INTERVAL_DAY, pendingIntent);
        Toast.makeText(this, "Alarm is set", Toast.LENGTH_SHORT).show();

    }

    private void cancelAlarm() {
        pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
        alarmManager.cancel(pendingIntent);
        Toast.makeText(this, "Canceled", Toast.LENGTH_SHORT).show();
    }

    private void showLog(String msg) {
        Log.d(TAG, msg);
    }
}
MyAlarm类别:

package com.jimmytrivedi.alarmdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.provider.Settings;
import android.util.Log;

public class MyAlarm extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String id = intent.getStringExtra("REMINDER_ID");
        Log.d("Test", "ID: "+ id) ;
        MediaPlayer mediaPlayer = MediaPlayer.create(context, Settings.System.DEFAULT_RINGTONE_URI);
        mediaPlayer.start();
        Log.d("Test", "Alarm just fired") ;
    }
}
在MainActivity中,我有一个方法
setAlarm
使用该方法调用receiver类的intent不知道intent为什么变为null?顺便说一句,onReceived Call和works还有其他事情。提醒也来了。我还打印了日志,这个:(Log.d(“Test”,“刚刚触发的报警”);)也在打印

为什么?


有什么帮助吗?

我刚刚解决了我的问题。 使用发送广播(意图)

private void setAlarm(long time) {
        //creating a new intent specifying the broadcast receiver
         Intent intent = new Intent(this, MyAlarm.class);
         intent.putExtra("REMINDER_ID", "1");
         sendBroadcast(intent);

        //creating a pending intent using the intent
         pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

        //setting the repeating alarm that will be fired every day
        alarmManager.setRepeating(AlarmManager.RTC, time, AlarmManager.INTERVAL_DAY, pendingIntent);
        Toast.makeText(this, "Alarm is set", Toast.LENGTH_SHORT).show();

    }

你可以很容易地做这件事,它的工作完美地在我这边 您可以创建一个类名
AlaramManger

public class AlaramManger {

private AlarmManager Alarammanager;
@SuppressLint("StaticFieldLeak")
private static AlaramManger alaramManger = null;
private Context context;
private Intent alarmIntent;

public static AlaramManger getInstance(Context context) {
    if (alaramManger == null) {
        alaramManger = new AlaramManger(context);
    }
    return alaramManger;
}

public AlaramManger(Context context) {
    this.context = context;
    Alarammanager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmIntent = new Intent(context, AppMonitoringBroadCastReceiver.class);
    ;
}

private PendingIntent createPendingIntent(Context context) {
    alarmIntent.setAction(ConstantsApp.AlaramManager.START_ALARAM_SERVICE);
    int DRIVER_SERVICE_RESTART_PI_REQUEST_CODE = ConstantsApp.AlaramManager.requestCode;
    return PendingIntent.getBroadcast(context, DRIVER_SERVICE_RESTART_PI_REQUEST_CODE,
            alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
}

public void StartRepeatingMonitorning(Context context) {
    try {
        Alarammanager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1 * 60 * 100, createPendingIntent(context));//first start will start asap
        if (RemoteConfig.getConfig().isShowLogs())
            //  Toast.makeText(context, "Starting Monitering", Toast.LENGTH_LONG).show();
            LogCat.show("alaram start");

    } catch (Exception e) {
        Utils.LogExceptionToFabric(e);
        e.printStackTrace();
    }
}

public void cancelRepeatingAlaram(Context context) {
    try {
        Alarammanager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, AppMonitoringBroadCastReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(
                context, ConstantsApp.AlaramManager.requestCode, i, 0);
        Alarammanager.cancel(pendingIntent);
        pendingIntent.cancel();
        if (RemoteConfig.getConfig().isShowLogs())
//            Toast.makeText(context, "cancelRepeatingAlaram", 
  Toast.LENGTH_SHORT).show();
            LogCat.show("alaram cancel");

    } catch (Exception e) {
        Utils.LogExceptionToFabric(e);
        e.printStackTrace();
    }
}

public boolean isRepeatingAlaramManagerExist(Context context) {
    Intent myIntent = new Intent(context, AppMonitoringBroadCastReceiver.class);
    myIntent.setAction(ConstantsApp.AlaramManager.START_ALARAM_SERVICE);
    return (PendingIntent.getBroadcast(context, 
 ConstantsApp.AlaramManager.requestCode,
            myIntent, PendingIntent.FLAG_NO_CREATE) != null);
}
 }
现在当它被触发时,你可以得到广播

public class AppMonitoringBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

 // You can do your Stuff
 }
你可以叫它

if (! AlaramManger.getInstance(context).isRepeatingAlaramManagerExist(context)) {
             AlaramManger.getInstance(context).StartRepeatingMonitorning(context);
        }
您可以在清单中注册它

<receiver android:name=".receivers.AppMonitoringBroadCastReceiver"
        android:exported="false">
        <intent-filter>
            <action android:name="com.shahi.driver.START_SERVICE" />
        </intent-filter>
    </receiver>


“添加了一些随机文章”听起来不太好。为什么不进一步描述您的问题,或者添加一些调试尝试呢?我已经描述过了。顺便说一句,你能帮我吗?发送广播(意图);如何使用非活动类?如AlarmReceiver?如果您有问题,请将其添加到问题中或提出新问题。不要将注释部分用于that@NicoHaas,我的孩子帮帮我吧,我还在努力理解你的问题…@Pooja singh如果你在这段代码中有任何问题或问题,请告诉我,因为这段代码在1000多台设备上进行了测试。你也可以通过time Start重复监控,并根据你的时间进行设置。谢谢!为什么创建AlarmManager类?什么是ConstantsApp.AlamManager?因为它具有您所需的所有功能,如取消或设置