简体   繁体   中英

Android BroadcastReceiver and starting an intent

public class SessionManager extends BroadcastReceiver{
Date timeOff;
Date timeOn;

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


    if( "android.intent.action.SCREEN_OFF".equals(intent.getAction())) {
        Log.i("MobileViaNetReceiver", "Screen off - start time to end session");
        timeOff = Calendar.getInstance().getTime();
    } 

    if( "android.intent.action.ACTION_SHUTDOWN".equals(intent.getAction())) {
        // DO WHATEVER YOU NEED TO DO HERE
        Log.i("MobileViaNetReceiver", "Shut down - log off user");
        DbAdapter_User db = new DbAdapter_User(context);
        db.open();
        db.handleLogout();
        db.close();
    } 

    if( "android.intent.action.SCREEN_ON".equals(intent.getAction())) {

        timeOn = Calendar.getInstance().getTime();

        long diffInMs = timeOn.getTime()-timeOff.getTime();

        // convert it to Minutes
        long diffInMins = TimeUnit.MILLISECONDS.toMinutes(diffInMs);

        if ((int) (diffInMins) > 15) {
            //log out user
            Log.i("MobileViaNetReceiver", "User inactive for 15 minutes - logout user");
            DbAdapter_User db = new DbAdapter_User(context);
            db.open(); // ******* HERE *************
            db.handleLogout();
            db.close();

        } else {
            Log.i("MobileViaNetReceiver", "User still active");
        }
    }   
}

When the screen is turned ON I am checking if the user has turned scrren off for more than 15 mins, if yes, logout him. And go to LonIn screen. I want to start an intent when I call that handleLogout() (marked * HERE * * ) Can I do that when class extends BroadcastReceiver ? If no, what else can I do ?

You need to remember intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Blessings and happiness to the Google engineer who wrote the followint error message "E/AndroidRuntime( 2339): java.lang.RuntimeException: Unable to start receiver android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?"

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

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

}

Thanks to everyone who writes helpful messages here

Yes, you can do that. You just use the context that was passed into your onRecieve function when you're creating your Intent. Once you have the Intent, make this call:

Context.startActivity(yourIntent);

You certainly can. Try

Intent yourIntent = new Intent(context, YourActivity.class);
startActivity(yourIntent);

If you want to do it in your handleLogout method, pass in the Context.

private method handleLogout(Context context) {
    ...
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM