我正在查看Google I / O Android App iosched link,并发现他们在helper / util类中主要使用静态方法。但是,我发现许多人不建议在辅助类中使用静态方法。
假设我有3个活动正在做一些工作,如显示警告对话框或通知,那么我需要在所有3个活动中添加相同的代码。如果我在10个不同的活动中写入文件怎么办?是不是使用带有静态方法的辅助类比一次又一次地编写相同的代码更好的方法?如果不是那么最好的方法是什么。
public class NotificationHelper {
/**
* create notification
* @param context activity context
* @param title notification title
* @param contentText notification text
* @param mNotificationId notification id
*/
public static void setUpNotification(Context context, String title, String contentText, int mNotificationId) {
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(context).setLargeIcon((BitmapFactory.decodeResource(context.getResources(),R.drawable.launcher)))
.setSmallIcon(R.drawable.ic_notif)
.setContentTitle(title)
.setContentText(contentText).setPriority(NotificationCompat.PRIORITY_MAX);
Intent resultIntent = new Intent(context, MainActivity.class);
PendingIntent resultPendingIntent =
PendingIntent.getActivity(
context,
0,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
mBuilder.setOngoing(true);
NotificationManager mNotificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(mNotificationId, mBuilder.build());
}
/**
* cancel notification
* @param ctx context
* @param notifyId id of notification to be cancelled
*/
public static void cancelNotification(Context ctx, int notifyId) {
NotificationManager nMgr = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
nMgr.cancel(notifyId);
}
}
答案 0 :(得分:2)
Helper classes
的用法在面向对象编程中几乎没有争议。您可以使用普通类并包含该类的对象。或者您可以将公共代码放在基类中然后扩展它。但是,如果我们决定使用助手课程,那么以下几点可以帮助您作为指导。
帮助程序类是实用程序实体。它们就像实用程序一样更好地使用,因此通过将默认构造函数标记为私有来阻止实例化和扩展。
公开'静态'方法。在实用程序类中查看包中的类是否只需要这些方法,然后将acess修改器保持为package-private,如果需要外部类,则可以将它们公开。目的是防止公共API过多地暴露程序包详细信息。您还可以尝试在参数和返回类型中进行抽象。
尝试通过没有字段来保留stateless
这样的类。即使不需要,保持(静态)字段也可能引导引用对象。
正确命名这些类,让helper类的用户知道它的意图,并且它们只是实用程序类。同时根据用途命名方法并尽量减少混淆。
答案 1 :(得分:1)
很少有人记得与使用Utility类相关的问题(其中一些已经触及了之前的答案) -
一般来说,如果你有几个活动做一些常见的事情,比如使用相同的网络层,显示一般的错误提示和通知,那么最好的方法是将它们放在BaseActivity
中并让你的所有活动扩展它们。如果可以,请使用OOPS概念,例如将行为分组到接口中,定义子活动必须扩展的抽象方法以及类似的东西。避免在BaseActivity
中做任何具体的事情,让孩子的活动尽可能多地控制。
如果您必须拥有实用程序类,请将它们设为单例且不带任何状态。
避免在实用程序方法中执行异步任务。请记住,Android上的每个组件都有一个生命周期,您执行的任何异步任务都必须与托管组件的生命周期相关联。因此,例如,如果您正在执行您认为必须花费一段时间的文件操作,请将其包装在asynctask
或您的调用组件中的某些内容中。
公用事业类是注射的好成员(我的意见!!)。如果最终使用太多的实用程序库,请尝试使用像Dagger这样的DI库,以使您的生活更轻松。
答案 2 :(得分:0)
做到这一点
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
public class NetworkUtil {
public static boolean isNetworkAvailable(Context context)
{
ConnectivityManager connectivityManager =(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
}
答案 3 :(得分:0)
检查网络状态
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
/**
* Check device's network connectivity and speed
* @author emil http://stackoverflow.com/users/220710/emil
*
*/
public class Connectivity {
/**
* Get the network info
* @param context
* @return
*/
public static NetworkInfo getNetworkInfo(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo();
}
/**
* Check if there is any connectivity
* @param context
* @return
*/
public static boolean isConnected(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected());
}
/**
* Check if there is any connectivity to a Wifi network
* @param context
* @param type
* @return
*/
public static boolean isConnectedWifi(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI);
}
/**
* Check if there is any connectivity to a mobile network
* @param context
* @param type
* @return
*/
public static boolean isConnectedMobile(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE);
}
/**
* Check if there is fast connectivity
* @param context
* @return
*/
public static boolean isConnectedFast(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && Connectivity.isConnectionFast(info.getType(),info.getSubtype()));
}
/**
* Check if the connection is fast
* @param type
* @param subType
* @return
*/
public static boolean isConnectionFast(int type, int subType){
if(type==ConnectivityManager.TYPE_WIFI){
return true;
}else if(type==ConnectivityManager.TYPE_MOBILE){
switch(subType){
case TelephonyManager.NETWORK_TYPE_1xRTT:
return false; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_CDMA:
return false; // ~ 14-64 kbps
case TelephonyManager.NETWORK_TYPE_EDGE:
return false; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_EVDO_0:
return true; // ~ 400-1000 kbps
case TelephonyManager.NETWORK_TYPE_EVDO_A:
return true; // ~ 600-1400 kbps
case TelephonyManager.NETWORK_TYPE_GPRS:
return false; // ~ 100 kbps
case TelephonyManager.NETWORK_TYPE_HSDPA:
return true; // ~ 2-14 Mbps
case TelephonyManager.NETWORK_TYPE_HSPA:
return true; // ~ 700-1700 kbps
case TelephonyManager.NETWORK_TYPE_HSUPA:
return true; // ~ 1-23 Mbps
case TelephonyManager.NETWORK_TYPE_UMTS:
return true; // ~ 400-7000 kbps
/*
* Above API level 7, make sure to set android:targetSdkVersion
* to appropriate level to use these
*/
case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11
return true; // ~ 1-2 Mbps
case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9
return true; // ~ 5 Mbps
case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13
return true; // ~ 10-20 Mbps
case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8
return false; // ~25 kbps
case TelephonyManager.NETWORK_TYPE_LTE: // API level 11
return true; // ~ 10+ Mbps
// Unknown
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
default:
return false;
}
}else{
return false;
}
}
}