0

在我的应用程序中,我想通过前台服务和接收器获取 GPS 位置。一切都运行良好,但经过两三次成功运行。服务无法检测到互联网并返回 false

这是代码

活动中调用服务的接收者代码

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Intent ll24 = new Intent(getBaseContext(), AlarmReceiver.class);
    PendingIntent recurringLl24 = PendingIntent.getBroadcast(getBaseContext(), 0, ll24, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarms.setRepeating(AlarmManager.RTC_WAKEUP,0, 30*10*100, recurringLl24);
   }
 //.....
}

& 在接收器类

public class AlarmReceiver extends WakefulBroadcastReceiver 
{   
    static Context context;
    Date curTime,sdf,edf;
    private static final String LOG_TAG = "ForegroundService";

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        try 
        {
            Calendar c =  Calendar.getInstance();
            curTime =  new SimpleDateFormat( "HH:mm" ).parse(c.get( Calendar.HOUR_OF_DAY)+":"+c.get( Calendar.MINUTE));
            sdf = new SimpleDateFormat( "HH:mm" ).parse("08:00");
            edf = new SimpleDateFormat( "HH:mm" ).parse("20:00");    
            if(curTime.after(sdf) && curTime.before(edf))
            {
                Intent ll24Service = new Intent(context, ForegroundService.class);
                ll24Service.setAction(Constants.ACTION.STARTFOREGROUND_ACTION);
                ForegroundService.IS_SERVICE_RUNNING = true;
                startWakefulService(context,ll24Service);   
            }
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
 }

在服务等级

public class ForegroundService extends Service 
{
...
@Override
public int onStartCommand(Intent intent, int flags, int startId) 
{
    AlarmReceiver.completeWakefulIntent(intent);
    if (intent.getAction().equals(Constants.ACTION.STARTFOREGROUND_ACTION)) 
    {
        Log.i(LOG_TAG, "Received Start Foreground Intent ");
        showNotification();

        Calendar c =  Calendar.getInstance();
        curDateTime  = c.get( Calendar.YEAR)+"-"+ String.valueOf(c.get( Calendar.MONTH )+1)+"-"+ c.get( Calendar.DAY_OF_MONTH)+" "+c.get( Calendar.HOUR_OF_DAY)+":"+c.get( Calendar.MINUTE)+":"+c.get( Calendar.SECOND);

        gps = new GPS(ForegroundService.this);
        if(gps.canGetLocation())
        {
            double latitude = gps.getLatitude();
            double longitude = gps.getLongitude();
            latt=Double.toString(latitude);
            longi =String.valueOf(longitude);

            insertData();   
        }
        else
        {
            gps.showSettingsAlert();
        }   
    } 

@Override
public void onDestroy() {
    super.onDestroy();
    Log.i(LOG_TAG, "In onDestroy");
}

private void insertData() 
{
    try
    {
        String QUERY = "insert into GpsLoc values('"+usr+"','"+latt+"','"+longi+"','"+curDateTime+"')";
        myDatabase.execSQL(QUERY);

        Log.i(LOG_TAG, "insert");
        ConnectionDetector cd = new ConnectionDetector(getApplicationContext());
        Boolean isInternetPresent = cd.isConnectingToInternet();

        if(isInternetPresent)
        {
            Log.i(LOG_TAG, "chk int");
            addToJason();
        }
        else
        {
            Log.i(LOG_TAG, "No int");
            stopForeground(true);
            stopSelf();
        }



    }
    catch(Exception ex)
    {
        Toast.makeText(getApplicationContext(), "Data not inserted : "+ex.toString(), Toast.LENGTH_LONG).show();
    }
}

一切都运行良好,如日志所示:

03-19 12:11:48.160: I/ForegroundService(17476): 收到启动前台意图

03-19 12:11:48.270:D/网络(17476):网络

03-19 12:11:48.340:I/ForegroundService(17476):插入

03-19 12:11:48.390: I/ForegroundService(17476): chk int

03-19 12:11:49.340: I/ForegroundService(17476): 上传

03-19 12:11:49.350: I/ForegroundService(17476): 在 onDestroy

但是经过两三个运行相同的日志成为

03-19 12:15:34.670: I/ForegroundService(17476): 收到启动前台意图

03-19 12:15:34.740:D/网络(17476):网络

03-19 12:15:34.780:I/ForegroundService(17476):插入

03-19 12:15:34.780: I/ForegroundService(17476): 无 int

03-19 12:15:34.850: I/ForegroundService(17476): 在 onDestroy

问题是在应用程序未运行并通过服务调用时检查互联网连接。请提出任何解决方案

有时它会抛出:

03-27 12:30:07.240: I/ForegroundService(1543): android.view.WindowManager$BadTokenException: 无法添加窗口 -- 令牌 null 不适用于应用程序

有时:转换结果 jsonobject 时出错

当我们打电话来检测服务中的互联网时,请帮助 Problem Strat Here

ConnectionDetector cd = new ConnectionDetector(getApplicationContext());
Boolean isInternetPresent = cd.isConnectingToInternet();
4

1 回答 1

1

gradle在您的文件中添加此依赖项。

compile 'com.firebase:firebase-jobdispatcher:0.8.5'

创建一个Firebase JobService文件并在manifest.

<service
        android:exported="false"
        android:name="._User_Classes.User_Call_Record.ScheduledJobService">
        <intent-filter>
        <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
        </intent-filter>
        </service>

声明并JobService从你的activity或片段开始

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
        Job myJob = dispatcher.newJobBuilder()
                .setService(ScheduledJobService.class) // the JobService that will be called
                .setRecurring(false) //repeat the job or not

                .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
                .setTrigger(Trigger.executionWindow(0, 60))
                .setLifetime(Lifetime.FOREVER)
                .setTag("demo")        // uniquely identifies the job
                .build();
        dispatcher.mustSchedule(myJob);

下面是JobService每次执行作业时都会调用的类。

public class ScheduledJobService extends JobService {

    @Override
    public boolean onStartJob(JobParameters job) {
    if(isConnected(this))
{
//internet available
}
else{
//internet not available
}
       //perform your operations
        FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new 
        GooglePlayDriver(this));
        Job myJob = dispatcher.newJobBuilder()
                .setService(ScheduledJobService.class) // the JobService that will be called
                .setRecurring(false) //repeat the job or not
                .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
                .setTrigger(Trigger.executionWindow(0, 60))
                .setLifetime(Lifetime.FOREVER)
                .setTag("demo")        // uniquely identifies the job
                .build();
        dispatcher.mustSchedule(myJob);
        return true;
    }






    @Override
    public boolean onStopJob(JobParameters job) {
        return false;
    }

 public static NetworkInfo getNetworkInfo(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo();
    }

    /**
     * Check if there is any connectivity
     *
     * @param context
     * @return
     */
    public static boolean isConnected(Context context) {
        NetworkInfo info = getNetworkInfo(context);
        return (info != null && info.isConnected());
    }

}

我希望它有帮助

于 2018-03-21T09:58:57.500 回答