完成android应用程序

完成android应用程序,android,terminate,receiver,Android,Terminate,Receiver,我想在按下按钮时完成我的应用程序,但它终止,logcat向我抛出一个错误。你能看看吗?上面说接收人没有注册,但我有 按钮的代码 stopService(new Intent(MainActivity.this, GPSandSMSService.class)); finish(); GPS和SMS服务的代码 public class GPSandSMSService extends Service { private IntentFilter mIntentFilter; pu

我想在按下按钮时完成我的应用程序,但它终止,logcat向我抛出一个错误。你能看看吗?上面说接收人没有注册,但我有

按钮的代码

stopService(new Intent(MainActivity.this, GPSandSMSService.class));
finish();
GPS和SMS服务的代码

public class GPSandSMSService extends Service {
    private IntentFilter mIntentFilter;
    public static final String USER_KEYWORD = "USER_KEYWORD";
    public static final String USER_NUMBER = "USER_NUMBER";
    public static final String HOME_LONGITUDE = "HOME_LONGITUDE";
    public static final String HOME_LATITUDE = "HOME_LATITUDE";
    private final String PROX_ALERT = "com.emmanuilvaresis.oldiefinder.ProximityAlert";
    SharedPreferences prefs;
    Context context;
    double lng, lat, hlat, hlng;
    float radius = 500f; // meters
    long expiration = -1; // do not expire
    protected LocationManager locationManager;
    Location location;
    PackageManager packageManager;
    static int flag = 0;

    @Override
    public void onCreate(){
        context = getApplicationContext();
        prefs = PreferenceManager.getDefaultSharedPreferences(context);

        String svcName = Context.LOCATION_SERVICE;
        locationManager = (LocationManager) getSystemService(svcName);
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setPowerRequirement(Criteria.POWER_LOW);
        criteria.setAltitudeRequired(false);
        criteria.setBearingRequired(false);
        criteria.setSpeedRequired(false);
        criteria.setCostAllowed(true);
        String provider = locationManager.getBestProvider(criteria, true);
        packageManager = getPackageManager();
        if (packageManager.checkPermission(android.Manifest.permission.ACCESS_FINE_LOCATION, getPackageName())
                == PackageManager.PERMISSION_GRANTED){
            locationManager.requestLocationUpdates(provider, 10 * 1000, 100, locationListener);
            location = locationManager.getLastKnownLocation(provider);
            getCoordinates(location);
        }
        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
        registerReceiver(SMSChecker, mIntentFilter);
    }

    private void getCoordinates(Location l){
        if (l != null) {
            lat = l.getLatitude();
            lng = l.getLongitude();
        }

        double templat, templng;
        templat = prefs.getFloat(HOME_LATITUDE, 0);
        templng = prefs.getFloat(HOME_LONGITUDE, 0);
        if((hlat != templat) && (hlng != templng)){
            hlat = templat;
            hlng = templng;
            if((hlat!=0) && (hlng!=0)){
                addProximityAlert(hlat, hlng);
            }
        }
    }

    private final LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            getCoordinates(location);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }
    };

    @Override
    public void onDestroy(){
        super.onDestroy();
        unregisterReceiver(SMSChecker);
        unregisterReceiver(MapAlertReceiver);
    }



    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private void addProximityAlert(double latitude, double longitude) {
        if (packageManager.checkPermission(android.Manifest.permission.ACCESS_FINE_LOCATION, getPackageName())
                == PackageManager.PERMISSION_GRANTED){
            Intent intent = new Intent(PROX_ALERT);
            PendingIntent proximityIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
            locationManager.addProximityAlert(latitude, longitude, radius, expiration, proximityIntent);
            IntentFilter filter = new IntentFilter(PROX_ALERT);
            registerReceiver(MapAlertReceiver, filter);
        }
    }

    public final BroadcastReceiver SMSChecker = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if(action.equals("android.provider.Telephony.SMS_RECEIVED")){
                String msgBody = "";
                SmsMessage[] messages;
                Bundle bundle = intent.getExtras();

                if (bundle != null){
                    Object[] pdus = (Object[]) bundle.get("pdus");
                    messages = new SmsMessage[pdus.length];
                    for (int i = 0; i < pdus.length; i++){
                        messages[i] = SmsMessage.createFromPdu((byte []) pdus[i]);
                        msgBody = messages[i].getDisplayMessageBody().toString();
                    }
                    String msg1;
                    prefs = context.getSharedPreferences("com.emmanuilvaresis.oldiefinder_preferences", Context.MODE_PRIVATE);

                    msg1 = prefs.getString(USER_KEYWORD, "0");
                    if (msgBody.equals(msg1)){
                        String msgText = context.getString(R.string.msgforloc) + " http://google.com/maps/place/" + lat + "," + lng;
                        String number = prefs.getString(USER_NUMBER, "0");
                        try {
                            if ((lat!=0) && (lng!=0) && !(number.equals("0"))){
                                SmsManager smsManager = SmsManager.getDefault();
                                smsManager.sendTextMessage(number, null, msgText, null, null);
                                Toast.makeText(context, context.getString(R.string.messagesent), Toast.LENGTH_SHORT).show();
                            }
                            else {
                                Toast.makeText(context, context.getString(R.string.messagenotsent), Toast.LENGTH_SHORT).show();
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }
                }
            }
        }
    };

    public final BroadcastReceiver MapAlertReceiver = new BroadcastReceiver() {

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

            final String key = LocationManager.KEY_PROXIMITY_ENTERING;
            final Boolean entering = intent.getBooleanExtra(key, false);
            if (!entering) {
                if (flag == 0) {
                    String msgBody = context.getString(R.string.msgformap);
                    String number = prefs.getString(USER_NUMBER, "0");
                    try {
                        if ((lat != 0) && (lng != 0) && !(number.equals("0"))) {
                            SmsManager smsManager = SmsManager.getDefault();
                            smsManager.sendTextMessage(number, null, msgBody, null, null);
                            Toast.makeText(context, context.getString(R.string.messagesent), Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(context, context.getString(R.string.messagenotsent), Toast.LENGTH_SHORT).show();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    flag = 1;
                }
            } else {
                flag = 0;
            }
        }
    };
}

从您的日志猫:
接收器未注册

您无法注销从未注册过的内容

您的
onCreate
仅保证注册1个接收器(
SMSChecker

但是您的
onDestroy
会执行以下操作:

@Override
public void onDestroy(){
    super.onDestroy();
    unregisterReceiver(SMSChecker);
    unregisterReceiver(MapAlertReceiver);
}

因此,
MapAlertReceiver
只在未注册的情况下注册了一部分时间,而您尝试关闭应用程序时,应用程序崩溃。

您似乎正在呼叫:

unregisterReceiver(MapAlertReceiver);

onDestroy
,但它可能尚未注册。

可能的副本根据您的日志,您似乎没有在
onDestroy()
@Trinimon中未注册的
onCreate()
中注册
BroadcastReceiver
com.emmanuilvaresis.oldiefinder.GPSandSMSService
),GPSandSMSService是一种服务。它不是广播接收器。我已经注册了两个广播接收器。第一个(SMSChecker)在onCreate()中注册,第二个(MapAlertReceiver)在private void addProximityAlert(双纬度,双经度)中注册是的,但第二个接收器不保证注册-查看它前面的所有逻辑!我打赌它没有在某些场景的sOK中注册,所以在我注销第二个接收器之前,我需要检查它是否先注册。是吗???非常感谢你的帮助。我试着接住球,拼命地工作。
unregisterReceiver(MapAlertReceiver);