Search code examples
androidbroadcastreceiver

Broadcast Receiver force close my application


I created a broadcast receiver to start activity onReceive like this:

public class BroadcastReceiver1 extends BroadcastReceiver {

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

    Toast.makeText(context, "Broadcast radi", Toast.LENGTH_SHORT).show();

    Intent intent1 = new Intent(context, ShootTheDuckActivity.class);
    intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent1); 

}

}

But my application force closes and it gives mi this in LogCat:

03-03 16:58:31.454: D/dalvikvm(3738): GC_EXTERNAL_ALLOC freed 120K, 51% free 2700K/5447K, external 1034K/1038K, paused 54ms
03-03 16:58:59.834: D/dalvikvm(3738): GC_EXTERNAL_ALLOC freed 117K, 50% free 2769K/5511K, external 1374K/1558K, paused 57ms
03-03 16:58:59.973: D/AndroidRuntime(3738): Shutting down VM
03-03 16:58:59.973: W/dalvikvm(3738): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-03 16:58:59.995: E/AndroidRuntime(3738): FATAL EXCEPTION: main
03-03 16:58:59.995: E/AndroidRuntime(3738): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.etfpodgorica.WakeUpAlarm/com.etfpodgorica.WakeUpAlarm.ShootTheDuckActivity}: java.lang.NullPointerException
03-03 16:58:59.995: E/AndroidRuntime(3738):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
03-03 16:58:59.995: E/AndroidRuntime(3738):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
03-03 16:58:59.995: E/AndroidRuntime(3738):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-03 16:58:59.995: E/AndroidRuntime(3738):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
03-03 16:58:59.995: E/AndroidRuntime(3738):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-03 16:58:59.995: E/AndroidRuntime(3738):     at android.os.Looper.loop(Looper.java:123)
03-03 16:58:59.995: E/AndroidRuntime(3738):     at android.app.ActivityThread.main(ActivityThread.java:3683)
03-03 16:58:59.995: E/AndroidRuntime(3738):     at java.lang.reflect.Method.invokeNative(Native Method)
03-03 16:58:59.995: E/AndroidRuntime(3738):     at java.lang.reflect.Method.invoke(Method.java:507)
03-03 16:58:59.995: E/AndroidRuntime(3738):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-03 16:58:59.995: E/AndroidRuntime(3738):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-03 16:58:59.995: E/AndroidRuntime(3738):     at dalvik.system.NativeStart.main(Native Method)
03-03 16:58:59.995: E/AndroidRuntime(3738): Caused by: java.lang.NullPointerException
03-03 16:58:59.995: E/AndroidRuntime(3738):     at com.etfpodgorica.WakeUpAlarm.ShootTheDuckActivity.onCreate(ShootTheDuckActivity.java:61)
03-03 16:58:59.995: E/AndroidRuntime(3738):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-03 16:58:59.995: E/AndroidRuntime(3738):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
03-03 16:58:59.995: E/AndroidRuntime(3738):     ... 11 more

ShootTheDuckActivity looks like this:

public class ShootTheDuckActivity extends Activity {

public static String filename="Settings";
SharedPreferences data;
SharedPreferences.Editor editor;
int tezinaProblema=0;//0-Easy; 1-Medium; 2-Hard
static double brzina = 1;

int indikator=0;
static MediaPlayer shot;
MediaPlayer explosion;
MediaPlayer player;
private boolean PozivIzMenija=false;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.shoottheduck);

    Toast.makeText(ShootTheDuckActivity.this, "Shoot the bird to shut down alarm",   Toast.LENGTH_LONG).show();

    data=getSharedPreferences(filename,0);
    editor=data.edit();
    tezinaProblema=data.getInt("Lvl:", 0);
    if (tezinaProblema == 0) {
        brzina = 1;
    } else {
        if (tezinaProblema == 1) {
            brzina = 0.5;
        } else {
            if (tezinaProblema == 2) {
                brzina = 0.2;
            }
        }
    }

    Bundle podesavanja = getIntent().getExtras();
    PozivIzMenija=podesavanja.getBoolean("PozivIzMenija");
    if(PozivIzMenija==false){ 

        player = MediaPlayer.create(this, R.raw.demo);  //vec postoji
        player.setLooping(true); // Set looping      //vec postoji
        player.start();              //vec postoji

    }

    shot = MediaPlayer.create(this, R.raw.pucanj);
    shot.setLooping(false);

    explosion = MediaPlayer.create(this, R.raw.explosion);
    explosion.setLooping(false);

    final ImageView button = (ImageView) findViewById(R.id.imageViewSD1);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Perform action on click
                indikator=1;

                if(PozivIzMenija==false){ 
                    player.stop();   //vec postoji
                }

                button.setImageResource(R.drawable.background);
                button.setBackgroundResource(R.drawable.explosion);
                AnimationDrawable explosionAnimation = (AnimationDrawable) button.getBackground();

                explosionAnimation.start();
                explosion.start();

                Timer timer = new Timer();
                timer.schedule(new TimerTask() {
                    public void run() {
                        finish();
                    }
                }, 1100);

                //finish();
            }
    });
    Thread thr = new Thread(mTask);
    thr.start();

}

Runnable mTask = new Runnable() {
    public void run() {
        // just sleep for x seconds.
        int i;
        i=1;
        while (i!=0) {
                    try {
                        Thread.sleep((long) (50*brzina));
                        runOnUiThread(done);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    i=i+1;
                    if (indikator==1) {break;}
        }
        }
    };
    int a=10;
    int b=10;
    int a1=10;
    int b1=10;
    static int left;
    static int right;
    static int top;
    static int bottom;
    Runnable done = new Runnable() {
        public void run() {
            final ImageView button = (ImageView) findViewById(R.id.imageViewSD1);
            if (button.getRight()>getApplicationContext().getResources().getDisplayMetrics().widthPixels*0.95) {
                a=(-1)*a1;
            } 
            else {
                if (button.getLeft()<10) {
                    a=a1;
            }
            }
            if (button.getBottom()>getApplicationContext().getResources().getDisplayMetrics().heightPixels*0.7) {
                b=(-1)*b1;
            }
            else {
                if (button.getTop()<10) {
                    b=b1;
                }
            }

            button.post(new Runnable() {
                public void run() {
                    //button.offsetLeftAndRight(a);
                    //button.offsetTopAndBottom(b);
                    //button.bringToFront();
                    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                    lp = (LinearLayout.LayoutParams) button.getLayoutParams();
                    left = lp.leftMargin;
                    right = lp.rightMargin;
                    top = lp.topMargin;
                    bottom = lp.bottomMargin;
                    lp.setMargins(left+a, top+b, right-a, bottom-b);
                    button.setLayoutParams(lp);
                }
            }); 
            //button.offsetLeftAndRight(a);
            //button.offsetTopAndBottom(b);
            //button.setText("aaa");

            }
        };

        public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                shot.start();
                return true;
            }
            return super.onTouchEvent(event);
        }

        public void onDestroy() {
            super.onDestroy(); 
            if(PozivIzMenija==false){ 
                player.stop();   //vec postoji
            }
        }

        public void onBackPressed() {
            if(PozivIzMenija==true){
                finish();
                return ;
            }

            PendingIntent pendingIntent;
            Context mContext = this.getApplicationContext();
            Intent intent = new Intent();
            Calendar c = Calendar.getInstance();
            AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
            Random generator = new Random();
            int i = generator.nextInt(1000000);

            intent.setClass(mContext, ShootTheDuckActivity.class);
            pendingIntent =  PendingIntent.getActivity(mContext, i, intent, 0);
            c.set(Calendar.MINUTE,c.get(Calendar.MINUTE)+1);
            am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);

            Toast.makeText(ShootTheDuckActivity.this, "Snooze", Toast.LENGTH_LONG).show();

            finish();
        }
}

Solution

  • Well, for one, you're not supplying a Bundle with the Intent you are using to start your duck-shooting Activity. From the code you pasted it's hard to determine exactly what's blowing up on row 61 in onCreate (you may want to include that tidbit in your question). But, as a first guess - in the Activity you clearly assume that Intent#getExtras() will not return null (it can). Maybe adding a null-check here?

    Bundle podesavanja = getIntent().getExtras();
    PozivIzMenija=podesavanja.getBoolean("PozivIzMenija");