使用报警管理器调用服务类 [英] Invoking service class using Alarm Manager

查看:144
本文介绍了使用报警管理器调用服务类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经开发了一个应用程序来监控每一分钟后网络状态....我使用的服务组件来监视网络状态和存储网络的详细信息到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);

这篇关于使用报警管理器调用服务类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆