我是Android的新手,我陷入了一个受孕问题。 我有一个包含多个活动的应用程序,其中一些活动很关键,需要用户登录webApp。
当用户单击按钮以达到其中一个关键活动时,我会调用后台服务,询问用户是否仍然连接到webApp(不是超时)。如果用户已登录,则会启动活动,否则会弹出一个对话框并询问用户名和密码。问题是有几个受保护的活动,我想使用相同的服务来进行验证。我现在这样做的方式有效,但它有点像kludgy。
public class A_Activity extends Activity {
Context context;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = getApplicationContext();
setButtonClickListener();
}
private void setButtonClickListener() {
button_1 = (Button)findViewById(R.id.button1);
button_1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intentCall = new Intent(context,com.them.cp.ConnexionManagerService.class);
intentCall.putExtra("WHO_IS_CALLED","FIRST_ACTIVITY");
context.startService(intentCall);
}
});
button_2 = (Button)findViewById(R.id.button2);
button_2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intentCall = new Intent(context,com.them.cp.ConnexionManagerService.class);
intentCall.putExtra("WHO_IS_CALLED","SECOND_ACTIVITY");
context.startService(intentCall);
}
});
}
}
我的服务
public class ConnexionManagerService extends Service{
public class IsConnectedAsync extends AsyncTask<String , Void, Void>{
protected Void doInBackground(String... whoIsCalled) {
String redirectedURL = getRedirectedURL();
if(redirectedURL.equalsIgnoreCase(IF_NOT_CONNECTED_URL)){
if(whoIsCalled[0].equalsIgnoreCase("FIRST_ACTIVITY")){
Intent trueIntent = new Intent(getBaseContext(), FirstActivity.class);
trueIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplication().startActivity(trueIntent);
}
else if(whoIsCalled[0].equalsIgnoreCase("SECOND_ACTIVITY")){
Intent trueIntent = new Intent(getBaseContext(), SecondActivity.class);
trueIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplication().startActivity(trueIntent);
}
}
else{
Intent falseIntent = new Intent(getBaseContext(), PopUpLoginActivity.class);
falseIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplication().startActivity(falseIntent);
}
}
return null;
}
}
@Override
public void onCreate() {
Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
Log.d("service onCreate", "onCreate");
}
public int onStartCommand(Intent intent, int flags, int startId){
String whoIsCalled = intent.getStringExtra("WHO_IS_CALLED");
new IsConnectedAsync().execute(whoIsCalled);
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
凭借我的小知识,我希望我能发送一个意图,但似乎不可能,因为它不是UI线程。
我的问题是:我该怎样做才能使这项服务更通用?
答案 0 :(得分:1)
我想使用相同的服务进行验证。
如果您不销毁该服务,它将是相同的服务对象。如果启动服务的活动完成或停止服务,则可以销毁它,如果它是启动服务的唯一活动。如果要确保服务在后台提醒,请在应用程序类(扩展应用程序)和所需的每个活动中启动它。当活动停止服务或完成时,服务将不会被销毁,因为您的应用程序类仍然连接。
编辑:
要避免一次又一次地写putExtra:
public class StartOrder1 extends Intent {
public StartOrder(Context ctx, String activity_name){
super(ctx, ServiceName.class);
if(activity_name != null)
super.putExtra("WHO", activity_name);
else
super.putExtra("WHO", "UNKNOWN");
}
public String getWho(){
reurn.getIntExtra("WHO");
}
}
开始吧:
this.startService(new StartOrder1(this, "My activity name"));
最佳解决方案:
public class StartOrder2 extends Intent {
public StartOrder(Activity a){
super(a, ServiceName.class);
super.putExtra("WHO", a.toString());
}
public String getWho(){
reurn.getIntExtra("WHO");
}
}
你可以在每个Activity中覆盖toString方法,传递活动名称,类名,无论你想要什么。然后当你开始一个意图时:
this.startService(new StartOrder2(this));
或使用此实用程序扩展Activity:
public class EnhancedActivity extends Activity{
protected startMyService(String name){
Intent i = new Intent(this, MyService.class);
i.putExtra("who", name);
startService(i);
}
}
并在最后的活动中调用它
[...]
super.startMyService("activity_name");
[...]