我正在使用 startService(Intent intent)方法启动服务。当我调用此功能时,它会到达服务的 onCreate ,但无法调用 onStartCommand 。这是我的代码 -
@Override
public void onReceive(Context context, Intent intent) {
// Send a text notification to the screen.
Log.e("mudit", "Action: " + intent.getAction());
try {
ConnectivityManager connManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = connManager.getActiveNetworkInfo();
Log.e("mudit", "getType: " + info.getType());
Log.e("mudit", "isConnected: " + info.isConnected());
if (info.isConnected()) {
Intent newinIntent = new Intent(context, service.class);
context.startService(newinIntent);
}
} catch (Exception e) {
e.printStackTrace();
Intent newinIntent = new Intent(context, service.class);
context.stopService(newinIntent);
}
}
服务代码 -
package com.android.service;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
public class service extends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this, "Service created...", Toast.LENGTH_LONG).show();
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service destroyed ...", Toast.LENGTH_LONG).show();
}
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "onStartCommand...", Toast.LENGTH_LONG).show();
return 1;
}
}
Manifest.xml -
<receiver class=".AReceiver" android:name=".AReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<service class=".service" android:name=".service"
android:enabled="true" android:icon="@drawable/icon">
</service>
答案 0 :(得分:3)
- 未绑定服务:它在后台无限期地运行,甚至也开始了服务结束的活动。
- 绑定服务:它将持续到活动的生命时间。
醇>活动可以通过
startService()
启动服务,并通过stopService()
停止。 如果活动想要与服务互动,则可以使用bindService()
。在使用活动提供的意图数据调用
onCreate()
之后,调用第一个onStartCommand
。
答案 1 :(得分:2)
首先,您应在@Override
之前添加onStartCommand(..)
,然后确保Android项目的目标高于2.0 。
答案 2 :(得分:2)
larsVogel解决了这个问题(和许多其他人一样)in this excellent post。
这就是我如何调整他的代码来创建连接接收器,监视用户何时连接到WIFI网络以批量上传使用数据:
在清单文件中,放置一个接收器并在&lt;的结束标记之前声明一个服务。 / application&gt;:
<receiver android:name=".ConnMonitor" android:enabled="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<service android:name=".BatchUploadGpsData" ></service>
</application>
在名为ConnMonitor.java的单独文件中创建广播接收器类(请取消注释Log调用以便能够正确监视流)
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
public class ConnMonitor extends BroadcastReceiver {
private String TAG = "TGtracker";
@Override
public void onReceive(Context context, Intent intent) {
//String typeName = "";
String state = "";
int type = -1;
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );
NetworkInfo test = (NetworkInfo) connectivityManager.getActiveNetworkInfo();
//Log.v(TAG,"there has been a CONNECTION CHANGE -> "+intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO));
try {
//typeName = test.getTypeName().toString();
type = test.getType();
state = test.getState().toString();
//Log.i(TAG,"type -> '"+typeName +"' state -> '"+state+"'" );
} catch (Exception e) {
//typeName = "null";
type = -1;
state = "DISCONNECTED";
//Log.i(TAG,"type -> error1 "+e.getMessage()+ " cause = "+e.getCause() );
}
if ( (type == 1) && (state == "CONNECTED") ) {
//Log.i(TAG, "I am soooo friggin uploadin on this beautiful WIFI connection ");
Intent batchUploadDataService = new Intent(context, BatchUploadGpsData.class);
context.startService(batchUploadDataService);
} else {
//Log.e(TAG,"NO FOUND MATCH type -> '"+typeName +"' state -> '"+state+"'" );
}
}
}
最后,创建一个服务BatchUploadGpsData.java,如下所示:
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class BatchUploadGpsData extends Service {
final String TAG = "TGtracker";
@Override
public void onCreate() {
Log.e(TAG, "here i am, rockin like a hurricane. onCreate service");
// this service tries to upload and terminates itself whether it is successful or not
// but it only effectively DOES anything while it is created
// (therefore, you can call 1 million times if uploading isnt done, nothing happens)
// if you comment this next line, you will be able to see that it executes onCreate only the first it is called
// the reason i do this is that the broadcast receiver is called at least twice every time you have a new change of connectivity state with successful connection to wifi
this.stopSelf();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//Log.i(TAG, "Received start id " + startId + ": " + intent);
Log.e(TAG, "call me redundant BABY! onStartCommand service");
// this service is NOT supposed to execute anything when it is called
// because it may be called inumerous times in repetition
// all of its action is in the onCreate - so as to force it to happen ONLY once
return 1;
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
这不是伪代码,这是实际代码,在Android 2.2及更高版本上测试并运行。
测试此服务的方法是关闭并重新启动Android上的WIFI服务(关闭wifi路由器也会起作用)。但是此代码不会验证您是否有效连接到网络。为此,我建议您发出一个httpclient请求并检查调用的结果。超出了本讨论的范围。
注意:由于服务在与UI相同的线程上运行,因此我强烈建议您根据具体需要在单独的线程或asynctask上实现正确的上传。你也可以在一个单独的线程上运行整个服务,但这仍然不是讨论的范围,尽管在这些情况下是标准做法。
答案 3 :(得分:1)
我相信,您无法访问任何UI组件,如Dialog甚至是服务中的Toast。
试试这个。
public int onStartCommand(Intent intent, int flags, int startId) {
/* Toast.makeText(this, "onStartCommand...", Toast.LENGTH_LONG).show();
return 1; */
Log.i("YourService", "Yes this works.");
}
答案 4 :(得分:0)
首先,将您的课程命名为其他内容是我的建议,以避免混淆。这里的第二个例子是我对我所拥有的服务的明确要求。我在调用服务时使用完整路径名,因为它们与我的应用程序不在同一个包中。
<service android:name="com.public.service.UploaderService" android:icon="@drawable/vgbio"></service>
以下是我的服务类的要点,
package com.public.service;
....
public class UploaderService extends Service{
....
}
第三,确保将@Override用于onStartCommand()。