使用报警管理器调用服务类管理器

2023-09-07 23:59:01 作者:以前的我们去哪了-

我已经开发了一个应用程序来监控每一分钟后网络状态....我使用的服务组件来监视网络状态和存储网络的详细信息到Database.I我从广播接收机使用AlarmManager调用服务类一流的....我重复AlarmManager有序每分钟后,调用服务类....但不幸的是服务类不是每分钟后得到精确地调用......相反,它被调用了一段时间,它会停止......我在这里附上源$ C ​​$ C ....

I have developed an application to monitor network status after every minute.... i am using Service component to monitor the network status and storing the network details into the Database.I am invoking the service class from a Broadcast Receiver using AlarmManager class.... i am repeating the AlarmManager in-order to invoke the service class after every minute.... but unfortunately service class is not getting invoked exactly after every minutes... instead it gets invoked for some time and it will stop... i have attached the source code here....

请让我知道如何在后台持续使用AlarmMagerclass每一分钟后运行服务类...

Please let me know how to run the Service class continuously in the Background using AlarmMagerclass after every minute...

在此先感谢..; - )

Thanks in advance .. ;-)

我的服务类

public class NetworkInfoService extends Service implements LocationListener{

    private String strNetworkInfo;
    private LocationManager locationManager;
    private NetworkDetailsVO networkDetailsVO = new NetworkDetailsVO();
    private NetworkInfoDatabaseHelper networkInfoDatabaseHelper;

    @Override
    public void onCreate() {
        super.onCreate();

        ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
        TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);

        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

        if(networkInfo!=null && networkInfo.isConnected()){
            String networkState = getNetworkStateString(networkInfo.getState());
            String stateString = networkInfo.toString().replace(',', '\n');
            strNetworkInfo = String.format("Network Type: %s\n Network State: %s\n\n %s",
                    networkInfo.getTypeName(),networkState,stateString);
        }

        locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        /*locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 300f, this);*/

        telephonyManager.listen(new SignalStrengthDetector(), PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);

        networkDetailsVO.setNetworkInfo(strNetworkInfo);
        networkDetailsVO.setPhoneNumber(telephonyManager.getLine1Number());
        networkDetailsVO.setOperatorName(telephonyManager.getNetworkOperatorName());
        networkDetailsVO.setDateTime(new Date().toString());

        Log.i("Network DetailsFrom Service", networkInfo.toString());

        networkInfoDatabaseHelper = new NetworkInfoDatabaseHelper(getApplicationContext());
        networkInfoDatabaseHelper.saveRecord(networkDetailsVO);

    }

    @Override
    public void onStart(Intent intent, int startId) {

        ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
        TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);

        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

        if(networkInfo!=null && networkInfo.isConnected()){
            String networkState = getNetworkStateString(networkInfo.getState());
            String stateString = networkInfo.toString().replace(',', '\n');
            strNetworkInfo = String.format("Network Type: %s\n Network State: %s\n\n %s",
                    networkInfo.getTypeName(),networkState,stateString);
        }

        locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        /*locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 300f, this);*/

        telephonyManager.listen(new SignalStrengthDetector(), PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);

        networkDetailsVO.setNetworkInfo(strNetworkInfo);
        networkDetailsVO.setPhoneNumber(telephonyManager.getLine1Number());
        networkDetailsVO.setOperatorName(telephonyManager.getNetworkOperatorName());
        networkDetailsVO.setDateTime(new Date().toString());

        Log.i("Network DetailsFrom Service", networkInfo.toString());

        networkInfoDatabaseHelper = new NetworkInfoDatabaseHelper(getApplicationContext());
        networkInfoDatabaseHelper.saveRecord(networkDetailsVO);


    }


    /*
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        return Service.START_STICKY;
    }*/

    private String getNetworkStateString(NetworkInfo.State state){

        String stateString = "unknown";

        switch(state)
        {
        case CONNECTED: 
            stateString = "connected";             
            break;

        case CONNECTING:        
            stateString = "connecting";    
            break;

        case DISCONNECTED:      
            stateString = "disconnected";  
            break;

        case DISCONNECTING:     
            stateString = "disconnecting";  
            break;

        case SUSPENDED:         
            stateString = "suspended";              
            break;

        default: 
            stateString = "unknown";     

            break;

        }

        return stateString;
    }


    @Override
    public void onLocationChanged(Location location) {

        networkDetailsVO.setLatitude(location.getLatitude());
        networkDetailsVO.setLongitude(location.getLongitude());
        networkDetailsVO.setAccuracy(location.getAccuracy());
    }


    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }


    @Override
    public void onProviderDisabled(String string) {


    }

    @Override
    public void onProviderEnabled(String provider) {

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, this);
    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {


    }


    private class SignalStrengthDetector extends PhoneStateListener{

        @Override
        public void onSignalStrengthsChanged(SignalStrength signalStrength) {
            super.onSignalStrengthsChanged(signalStrength);
            networkDetailsVO.setSignalStrength(signalStrength.getGsmSignalStrength());
        }

    }




}

我的广播接收器类(已注册的android.intent.action.BOOT_COMPLETED意图)

My Broadcast Receiver class (it is registered for android.intent.action.BOOT_COMPLETED intent)

public class NetworkInfoListner extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        PendingIntent service = null; 
        Intent intentForService = new Intent(context.getApplicationContext(), NetworkInfoService.class);
        final AlarmManager alarmManager = (AlarmManager) context
                        .getSystemService(Context.ALARM_SERVICE);
        final Calendar time = Calendar.getInstance();
        time.set(Calendar.MINUTE, 0);
        time.set(Calendar.SECOND, 0);
        time.set(Calendar.MILLISECOND, 0);
        if (service == null) {
         service = PendingIntent.getService(context, 0,
                            intentForService,    PendingIntent.FLAG_CANCEL_CURRENT);
                }

                alarmManager.setRepeating(AlarmManager.RTC, time.getTime()
                        .getTime(), 60000, service);

    }

我的清单文件

My manifest file

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.networkinfodemo_v_03"
        android:versionCode="1"
        android:versionName="1.0" >

        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17" />

        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.example.networkinfodemo_v_03.activity.NetworkInfoActivity"
                android:configChanges="orientation|keyboardHidden|screenSize"
                android:label="@string/app_name"
                android:theme="@style/FullscreenTheme" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

            <service android:name="com.example.networkinfodemo_v_03.service.NetworkInfoService" android:enabled="true">
            </service>

            <receiver android:name="com.example.networkinfodemo_v_03.broadcastreceiver.NetworkInfoListner" >
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                </intent-filter>
            </receiver>
        </application>
     </manifest>

请让我知道什么是错误...

please let me know what is the error...

推荐答案

试试这个

Calendar cal = Calendar.getInstance();   
cal.add(Calendar.SECOND, 60);

service.setInexactRepeating(AlarmManager.RTC_WAKEUP,
        cal.getTimeInMillis(), 60000, pending);