-1

こんにちは、

デバイスで Android サービスを実行できませんでした。エミュレーターでうまく動作します。 サンプル コードは次のとおりです。コードを確認してください。

MyScheduleReceiver.java:

    package com.smpt.wi_ficonnector;
    import java.util.Calendar;
    import android.app.AlarmManager;
    import android.app.PendingIntent;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;

    public class MyScheduleReceiver extends BroadcastReceiver {

// Restart service every 30 seconds
private static final long REPEAT_TIME = 1000 * 30;

@Override
public void onReceive(Context context, Intent intent) {
    AlarmManager service = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, MyStartServiceReceiver.class);
    PendingIntent pending = PendingIntent.getBroadcast(context, 0, i,
            PendingIntent.FLAG_CANCEL_CURRENT);
    Calendar cal = Calendar.getInstance();
    // Start 30 seconds after boot completed
    cal.add(Calendar.SECOND, 30);
    //
    // Fetch every 30 seconds
    // InexactRepeating allows Android to optimize the energy consumption
    service.setInexactRepeating(AlarmManager.RTC_WAKEUP,
            cal.getTimeInMillis(), REPEAT_TIME, pending);

    // service.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
    // REPEAT_TIME, pending);

}
}

MyService.java:

このクラスは wifiservice クラスを呼び出します。これにより、サービスが開始されます。

    package com.smpt.wi_ficonnector;
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;

    public class MyService extends Service {

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

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return super.onStartCommand(intent, flags, startId);
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

}

MyStartServiceReceiver.java:

このクラスは、サービス クラスを呼び出します。このサービス クラスは、ユーザーに通知を表示します。

    package com.smpt.wi_ficonnector;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;

    public class MyStartServiceReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Intent service = new Intent(context, WifiService.class);
    context.startService(service);
}
}

WifiService.java:

このクラスは、wifi 接続を確認し、30 秒ごとに通知を送信していました。

パッケージ com.smpt.wi_ficonnector;

    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.os.Binder;
    import android.os.IBinder;

    public class WifiService extends Service {

private final IBinder mBinder = new MyBinder();

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub

    boolean networkStatus = haveNetworkConnection();
    ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    Notification not;
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    if(networkStatus == true || netInfo.isConnected() == true){
         not = new Notification(R.drawable.on, "Wi-Fi Connector", System.currentTimeMillis());
    } else {
         not = new Notification(R.drawable.off, "Wi-Fi is not connector", System.currentTimeMillis());
    }


    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), Notification.FLAG_ONGOING_EVENT);        
    not.flags = Notification.FLAG_ONGOING_EVENT;
    if(networkStatus == true || netInfo.isConnected() == true){
        not.setLatestEventInfo(this, "Wi-Fi Connector" , "Wi-Fi is connected. You can download data.", contentIntent);
    } else {
        not.setLatestEventInfo(this, "Wi-Fi Connector" , "Wi-Fi is not connected. You can not download data.", contentIntent);
    }

    mNotificationManager.notify(1, not);

    return Service.START_NOT_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}

public class MyBinder extends Binder {
    WifiService getService() {
        return WifiService.this;
    }
}

private boolean haveNetworkConnection() {
    boolean haveConnectedWifi = false;
    boolean haveConnectedMobile = false;

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo) {
        if (ni.getTypeName().equalsIgnoreCase("WIFI"))
            if (ni.isConnected())
                haveConnectedWifi = true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
            if (ni.isConnected())
                haveConnectedMobile = true;
    }
    return haveConnectedWifi || haveConnectedMobile;
}
}

AndroidManifest.xml:

このマニフェスト ファイルは、サービスをバックグラウンドで実行するように Android アプリケーションに指示します。また、アクティビティは使用しません。

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.smpt.wi_ficonnector"
    android:versionCode="1"
    android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="11" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <!--activity
        android:name="com.smpt.wi_ficonnector.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

    <service
        android:name=".WifiService"
        android:icon="@drawable/ic_launcher"
        android:label="@string/service_name" >
    </service>

    <service
        android:name="MyService"
        android:process=":meinprocess"
        android:icon="@drawable/ic_launcher"
        android:label="@string/service_name" >
    </service>

    <receiver android:name="MyScheduleReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    <receiver android:name="MyStartServiceReceiver" >
    </receiver>

</application>

私のコードはエミュレータで正常に動作しています。しかし、実際のデバイスでは機能しません。問題を見つけるために私を助けてください。

4

1 に答える 1

2

BOOT_COMPLETEDAndroid 3.1 以降、ユーザーがアプリケーションを少なくとも 1 回実行しない限り、Intentを受け取ることはありません。マニフェストにアクティビティがないため、ユーザーがアプリケーションを実行する方法はありません。これは、Android 3.1 以降を実行しているデバイスでは機能しません。

http://developer.android.com/about/versions/android-3.1.htmlの「停止したアプリケーションの起動コントロール」を参照してください。

于 2013-03-05T15:29:50.307 に答える