Android 新建工程上传代码报错

1.Can’t Update
No tracked branch configured for branch master or the branch doesn’t exist.
To make your branch track a remote branch call, for example,
git branch –set-upstream-to origin/master master (show balloon)

 

输入 git fetch

git branch –set-upstream-to=origin/master

 

2.Error merging: refusing to merge unrelated histories

git pull origin master –allow-unrelated-histories

 

pull – > add -> commit -> push

Activity和Fragment的生命周期

1.活动的生命周期

Android类中定义了七个回调方法分别是:

1. onCreate( ) 活动第一次创建时调用,在这个方法中进行初始化操作。

2. onStart( ) 这个实在活动又不可见到可见的时候调用。

3. onResume( ) 在活动准备好和用户交互的时候调用,此时活动已经位于返回栈的顶端,并且处于运行状态。

4. onPause( ) 系统准备去启动另一个或者恢复另一个活动时调用。当启动一个对话框,失去焦点时也会调用此方法。通常在这个方法中将一些消耗CPU的资源释放掉,并且在此时保存关键数据。

5. onStop( ) 当活动完全不可见的时候调用。

6. onDestory( ) 此方法在销毁之前调用,之后会变为销毁状态。

7. onRestart( ) 其在活动由停止状态变为运行状态之前调用,即活动被重新启动。

在这七个方法中,除了onRestart( )方法,其他的六个方法对应了活动的三种生存期:

onCreate( )-onDestory( ):完整的生存期

onStart( )-onStop( ):可见生存期

onResume( )-onPause( ):前台生存期(此时可以与用户进行交互)

这里写图片描述​

下面利用Activity A和B相互操作A调用的方法:

当启动Activity A时会调用:onCreate( )、onStart( )、onResume( )

当A启动Acitivity B时,A会调用:onPause( )、onStop( )

当按下Back键时,A会调用:onRestart( )、onStart( )、onResume( )

此时启动一个Dialog时,A并不会调用:onPause( )

再次按下Back键时,A调用:onResume( )

最后退出程序:onPause( )、onStop( )、onDestory( )

2.活动的启动模式

启动模式共有四种:standard、singleTop、singleTask和singleInstance

(1)standard模式:

默认启动模式,每启动一个activity就会创建一个新的实例放到栈顶。

(2)singletop模式:

首先判断要启动的Activity是否已经位于栈顶,如果已经存在则直接复用,如果不是,需要重新创建一个新的实例放入栈顶。

(3)singleTask模式:

此模式可以保证某个Activity在整个应用程序中仅有一个实例。此模式时,当创建一个新的Activity时会检查栈中是否已存在这个Activity的实例,如果已经存在则直接复用,并将其之上的所有实例全部出栈,否则就会重新创建一个新的实例。

(4)singleInstance模式:

此模式中,Activity会启动一个新的任务栈来管理Activity实例,无论从哪一个任务栈中启动这个Activity,该实例在整个系统中都仅仅会存在一个。此模式是为了在不同的程序中共享同一个Activity实例。

3.Fragment的生命周期

Fragment生命周期图:

​

Fragment和Activity的生命周期对比:

​

因为Fragment不可以单独存在,它是一种可以嵌入到活动的UI片段,相对于Activity是一种更加轻量级更灵活的的展示方式,因此它的生命周期和activity的生命周期相关联。

203-982-6197

本文转自:(832) 489-7424

重写ListVIew的BaseAdapter需要重写一下四个方法:

getCount()、getItem(int position)、getItemId(int position)以及getView(),其中最重要的是getView()方法。

@Override
public int getCount() {
    / How many items are in the data set represented by this Adapter.
  /(在此适配器中所代表的数据集中的条目数)
    return 0;
}

@Override
public Object getItem(int i) {
    / Get the data item associated with the specified position in the data set.
    /(获取数据集中与指定索引对应的数据项)
    return null;
}

@Override
public long getItemId(int i) {
    / Get the row id associated with the specified position in the list.
    /(取在列表中与指定索引对应的行id)
    return 0;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    / Get a View that displays the data at the specified position in the data set.
    return null;
}

其中最重要的处理就是getView:

第一种:没有任何处理。但是如果列表项数据量很大的时候,会每次都重新创建View,设置资源,严重影响性能。

@Override
public View getView(int i, View convertView, ViewGroup parent) {
    if(convertView == null)
    {
        convertView = mInflater.inflate(R.layout.list_item, null);
    }

    ImageView img = (ImageView)convertView.findViewById(R.id.img)
    TextView title = (TextView)convertView.findViewById(R.id.title);
    TextView info = (TextView)ConvertView.findViewById(R.id.info);
    img.setImageResource(R.drawable.ic_launcher);
    title.setText("Hello");
    info.setText("world");

    return convertView;
}

第二种ListView优化:通过缓存convertView,这种利用缓存contentView的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中的View,提升了性能。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null)
    {
        convertView = mInflater.inflate(R.layout.list_item, null);
    }

    ImageView img = (ImageView)convertView.findViewById(R.id.img)
    TextView title = (TextView)convertView.findViewById(R.id.title);
    TextView info = (TextView)ConvertView.findViewById(R.id.info);
    img.setImageResource(R.drawable.ic_launcher);
    title.setText("Hello");
    info.setText("world");

    return convertView;
}

第三种ListView优化:通过convertView+ViewHolder来实现,ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度。

当我们判断 convertView == null  的时候,如果为空,就会根据设计好的List的Item布局(XML),来为convertView赋值,并生成一个viewHolder来绑定converView里面的各个View控件(XML布局里面的那些控件)。再用convertView的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出。(看下面代码中)

如果convertView不为空的时候,就会直接用convertView的getTag(),来获得一个ViewHolder。

/在外面先定义,ViewHolder静态类 
staticclass ViewHolder
{
    public ImageView img;
    public TextView title;
    public TextView info;
}
/然后重写getView 
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if(convertView == null)
    {
        holder = new ViewHolder();
        convertView = mInflater.inflate(R.layout.list_item, null);
        holder.img = (ImageView)item.findViewById(R.id.img)
        holder.title = (TextView)item.findViewById(R.id.title);
        holder.info = (TextView)item.findViewById(R.id.info);
        convertView.setTag(holder);
    }else{
        holder = (ViewHolder)convertView.getTag();
        holder.img.setImageResource(R.drawable.ic_launcher);
        holder.title.setText("Hello");
        holder.info.setText("World");
    }

    return convertView;
}

到这里,可能会有人问ViewHolder静态类结合缓存convertView与直接使用convertView有什么区别吗,是否重复了

在这里,官方给出了解释

提升Adapter的两种方法

To work efficiently the adapter implemented here uses two techniques: -It reuses the convertView passed to getView() to avoid inflating View when it is not necessary

(译:重用缓存convertView传递给getView()方法来避免填充不必要的视图) -It uses the ViewHolder pattern to avoid calling findViewById() when it is not necessary

(译:使用ViewHolder模式来避免没有必要的调用findViewById():因为太多的findViewById也会影响性能) ViewHolder类的作用 -The ViewHolder pattern consists in storing a data structure in the tag of the view returned by getView().This data structures contains references to the views we want to bind data to, thus avoiding calling to findViewById() every time getView() is invoked

(译:ViewHolder模式通过getView()方法返回的视图的标签(Tag)中存储一个数据结构,这个数据结构包含了指向我们

要绑定数据的视图的引用,从而避免每次调用getView()的时候调用findViewById())

 

Service学习笔记

1.生命周期

四个手动调用的方法

手动调用的方法 作用
startService( ) 启动服务
stopService( ) 关闭服务
bindService( ) 绑定服务
unbindService( ) 解绑服务

五个内部自动调用的方法

内部自动调用的方法 作用
onCreat( ) 创建服务
onStartCommand( ) 开始服务
onDestory( ) 销毁服务
onBind( ) 绑定服务
onUnbind( ) 解绑服务

其中:

1. onCreat( )和onStartCommand( )的区别:onCreat( )方法实在服务的第一次创建的时候调用,而onStartCommand( )方法则再每次启动服务的时候均会调用。但是每个服务只会存在一个实例。

2. 服务启动了之后会一直保持运行状态,直到stopService( )或者stopSelf( )方法被调用。

3. 当调用了startService( )之后再去调用stopService( ),这是服务中的onDestory( )方法将会被调用,表示服务已经被销毁。同理bindService( )方法和unbindService( )方法类似,但是如果其即调用了startService( )方法有调用了bindService( )方法,那么该服务必须满足stopService( )和unbindService( )两种条件onDestory( )方法才被执行。

2. 活动与服务通信

如果自定义一个MyService来继承Service的话,可以看到onBind( )方法是Service中唯一的一个抽象方法:

public class MyService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

下面是创建一个专门的Binder来对下载功能进行管理的代码

public class MyService extends Service{

    private DownloadBinder mBinder = new DownloadBinder();

    class DownloadBinder extend Binder{

        public void startDownload(){
            Log.d("MyService", "startDownload executed");
        }

        public int getProgress(){
            Log.d("MyService", "getProgress executed");
            return 0;
        }
    }

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